json 的基础知识。
- array and list –> wrap in [ ]
- object –> wrap in { }
jackson 需要注意
- 需要序列化的pojo 的属性必须具有setter和getter方法,或者是public的。
java pojo –> json
一个简单的例子:
下面的例子是采用databind 的方式生成 json 串的。
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(person);
System.out.println(json);
序列化的配置:
//you can indent the json output. just use during testing.
objectMapper.configure(INDENT_OUTPUT, true);
//provide date formatter
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd_HH/mm/ss");
objectMapper.setDateFormat(simpleDateFormat);
//change the name of json properties, use some display strategy
objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.UPPER_CAMEL_CASE);
//handle null value
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
使用tree api 手动生成或者解析
使用tree api 手动构建一个json 串。
//用来手动创建节点。
JsonNodeFactory jsonNodeFactory = JsonNodeFactory.instance;
//jsonfactory 就是定义输入和输出的位置的
JsonFactory jsonFactory = new JsonFactory();
JsonGenerator jsonGenerator = jsonFactory.createGenerator(System.out);
//首先创建一个root 节点
ObjectNode root = jsonNodeFactory.objectNode();
root.put("username", "zhangsan");
root.put("age", 14);
root.put("friend", "wangwu");
ArrayNode arrayNode = jsonNodeFactory.arrayNode();
arrayNode.add(1);
arrayNode.add(2);
arrayNode.add(3);
arrayNode.add(4);
//然后创建一个 array 节点
root.put("ages",arrayNode);
ObjectMapper objectMapper = new ObjectMapper(jsonFactory);
objectMapper.writeTree(jsonGenerator, root);
使用tree api 解析一个json 串
String json = "{\"username\":\"zhangsan\",\"age\":14,\"friend\":\"wangwu\",\"ages\":[1,2,3,4]}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(json);
//解析基本的数据类型。
String username = jsonNode.findValue("username").asText();
int age = jsonNode.findValue("age").asInt();
//解析数组
JsonNode arrayNode = jsonNode.findValue("ages");
Iterator<JsonNode> iterator = arrayNode.iterator();
List<Integer> ages = new ArrayList<Integer>();
while (iterator.hasNext()) {
int temAge = iterator.next().asInt();
ages.add(temAge);
}
Person temPerson = new Person(username, age, new Date());
System.out.println(temPerson);
System.out.println(ages);
使用高级api data-bind 来解析数据。
对于开发者来首,面对的最多的是 java pojo。那么data-bind api 就是负责 将一个pojo对象解析成一个json串或者从一个json串生成一个pojo实例。
data-bind 解析和生成的例子。
//解析。
String json = "{\"username\":\"zhangsan\",\"age\":14}";
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(json, Person.class);
System.out.println(person);
//生成
Person zhangsanPerson = new Person("zhangsan", 16, new Date());
ObjectMapper objectMapper1 = new ObjectMapper();
String jsonResult = objectMapper1.writeValueAsString(zhangsanPerson);
System.out.println(jsonResult);
如果pojo的某些属性不想生成
- 你可以使用类级别的注解(@JsonIgnoreProperties),来屏蔽一些字段。就像:
@JsonIgnoreProperties({"username"})
public class Person {
....
}
在这个例子中,字段username就被屏蔽了。从一个json串生成时,username将会是null。从一个Person 实例生成json 时,将不会有username的信息。
结果就像下面一样:
Person{username='null', age=14, birthday=null}
{"age":16,"birthday":1468377397642,"firent":null}
- 使用字段级别的注解(@)
public class Person {
@JsonIgnore
private String username;
}
结果也像上面一样。
一些注解的含义
- @JsonProperty-This annotation is used to mark a method as a getter or setter for a property.
- @JsonCreator-This annotation is used the define constructors that are used to create java objects from json string.
- @JsonAnyGetter and @JsonAnySetter - This annotations are used to mark methods that set or read fields that are not handled by any other java property.
对于3 。来说是这个样子的,就是如果Jackson 在遇到pojo没有定义的属性时,就调用有3 注解的标签。来存放这些属性。
更详细的注解请看详细的注解说明