• 2013-03-17

    Jackson雕虫技(一)

    Tag:jackson

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://www.blogbus.com/dreamhead-logs/230244031.html

    Jackson是一个高性能JSON处理器,堪称目前Java世界处理JSON的首选。在Moco里,JSON文件的处理就是用它来做的。下面就以Moco处理中用到几点技巧介绍一下Jackson。

    读取对象

    采用Jackson的databind包,可以很容易地将一个JSON流映射为一个Java对象。下面是一个JSON流:

    {
      "request": {
        "text": "foo"
      },
      "response": {
        "text": "bar"
      }
    }

    我们要把它映射为下面的对象:

    @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
    public class SessionSetting {
      private RequestSetting request;
      private ResponseSetting response;
      ...
    }

    @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
    public class RequestSetting {
      private String text;
      ...
    }

    @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
    public class ResponseSetting {
     private String text;
      ...
    }

    通过下面这段代码就可以完成映射:

      ObjectMapper mapper = new ObjectMapper();
      SessionSetting setting = mapper.readValue(inputStream, SessionSetting.class);

    上面代码中的映射几乎一对一的,很好理解,唯一需要解释是每个类上的声明

      @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)

    这声明了字段可见性,如果不做任何声明,缺省情况下需要给每个字段增加一个getter,才能完成映射。

    读取集合

    目前Moco配置文件里实际上是一组Session配置,也就是一个JSON数组对象:

    [
    {
      "request": {
        "text": "foo"
      },
      "response": {
        "text": "bar"
      }
    }
    ]

    众所周知,JVM的范型是假范型,所以,下面的代码不起作用

      mapper.readValue(inputStream, List.class);

    当然,Jackson给我们提供了其它的方式读取集合,下面就是:

      TypeFactory factory = TypeFactory.defaultInstance();
      mapper.readValue(is, factory.constructCollectionType(List.class, SessionSetting.class));

    忽略字段

    在Moco的配置文件里,我们可以用description描述一个配置的作用,其实,它就是一个注释,在实际的代码里没有任何作用。我们当然像下面这么做,把它读到内存里:

    public class SessionSetting {
      private String description;
      ...
    }

    但Jackson给我们提供了更好的做法:

    @JsonIgnoreProperties({ "description" })
    public class SessionSetting {
      ...
    }

    这样一来,连运行时的内存占用都省了。

    分享到:

    历史上的今天:

    引用地址: