文章目录
Jackson代码Tree Mode注解方式自定义序列化和反序列化
Gson代码直接操作,不转对象注解
fastjson
三种类库的说明
Jackson 对象转json时空属性,默认会被序列化出来 SpringBoot相关的框架中,应用了Jackson 可以取别名 自定义序列化和反序列化Gson 对象转json时空属性,默认会序列化处理fastjson 对象转json时空属性,默认不会序列化处理
Jackson
官方文档:https://github.com/FasterXML/jackson-databind Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。
代码
ObjectMapper mapper
= new ObjectMapper();
SimpleDateFormat outputFormat
= new SimpleDateFormat("yyyy-MM-dd");
mapper
.setDateFormat(outputFormat
);
mapper
.configure(SerializationFeature
.ORDER_MAP_ENTRIES_BY_KEYS
, true);
mapper
.disable(DeserializationFeature
.FAIL_ON_UNKNOWN_PROPERTIES
);
Person person
= mapper
.readValue("{\"name\":\"Bob\", \"age\":13, \"nowDate\":\"2020-07-03\", \"mon\":\"未知属性\"}", Person
.class);
System
.out
.println(person
.toString());
Map
<String, Object> map
= mapper
.readValue("{\"name\":\"Bob\", \"age\":13, \"nowDate\":\"2020-07-03\"}", Map
.class);
System
.out
.println(map
);
List
<Person> persons
= mapper
.readValue("[{\"name\":\"Bob\", \"age\":13},{\"name\":\"Lala\", \"age\":15}]", List
.class);
System
.out
.println(persons
);
Person
[] personArr
= mapper
.readValue("[{\"name\":\"Bob\", \"age\":13},{\"name\":\"Lala\", \"age\":15}]", Person
[].class);
Arrays
.stream(personArr
).forEach(System
.out
:: print
);
System
.out
.println();
List
<Person> personList
= mapper
.readValue("[{\"name\":\"Bob\", \"age\":13},{\"name\":\"Lala\", \"age\":15}]", new TypeReference<List
<Person>>() {});
System
.out
.println(personList
);
System
.out
.println("==============obj2JsonStr=============");
String jsonString
= mapper
.writeValueAsString(person
);
System
.out
.println(jsonString
);
String mapJson
= mapper
.writeValueAsString(map
);
System
.out
.println(mapJson
);
String listJson
= mapper
.writeValueAsString(personList
);
System
.out
.println(listJson
);
Tree Mode
将json转成树结构来操作
ObjectMapper mapper
= new ObjectMapper();
JsonNode rootNode
= mapper
.readTree("{\"name\":\"Bob\", \"age\":13}");
String name
= rootNode
.get("name").asText();
System
.out
.println(name
);
int age
= rootNode
.get("age").asInt();
System
.out
.println(age
);
ObjectNode newNode
= mapper
.createObjectNode();
newNode
.setAll((ObjectNode
)rootNode
);
newNode
.put("sex", "1");
newNode
.with("other").put("type", "student");
String json
= mapper
.writeValueAsString(newNode
);
System
.out
.println(json
);
注解方式
官网文档:https://github.com/FasterXML/jackson-databind 注解使用手册
@Setter
@Getter
@ToString
@JsonIgnoreProperties(value
={ "foo" }, ignoreUnknown
=true)
public class Person {
@JsonProperty("name")
private String username
;
private int age
;
@JsonIgnore
private String bar
;
@JsonFormat(pattern
="yyyy-MM-dd",timezone
="GMT+8")
private Date date
;
}
ObjectMapper mapper
= new ObjectMapper();
Person person
= mapper
.readValue("{\"name\":\"Bob\", \"age\":13, \"foo\":\"foo\", \"bar\":\"bar\", \"date\":\"2020-07-03\"}", Person
.class);
System
.out
.println(person
.toString());
System
.out
.println("==============obj2JsonStr=============");
String jsonString
= mapper
.writeValueAsString(person
);
System
.out
.println(jsonString
);
自定义序列化和反序列化
https://www.jianshu.com/p/135d8dd265d6
Gson
官方文档:https://github.com/google/gson/blob/master/UserGuide.md Google提供的用来java对象和JSON数据之间进行映射的JAVA类库,可以将一个JSON字符转成一个java对象,反过来也OK。 GSON可按需解析,即创建的JavaBean类不用完全对应Json数据里面的所有key
代码
Gson gson
= new Gson();
Person person
= gson
.fromJson("{\"name\":\"Bob\", \"age\":13, \"nowDate\":\"2020-07-03\", \"mon\":\"未知属性\"}", Person
.class);
System
.out
.println(person
.toString());
Map
<String, Object> map
= gson
.fromJson("{\"name\":\"Bob\", \"age\":13, \"nowDate\":\"2020-07-03\"}", Map
.class);
System
.out
.println(map
);
List
<Person> persons
= gson
.fromJson("[{\"name\":\"Bob\", \"age\":13},{\"name\":\"Lala\", \"age\":15}]", List
.class);
System
.out
.println(persons
);
Person
[] personArr
= gson
.fromJson("[{\"name\":\"Bob\", \"age\":13},{\"name\":\"Lala\", \"age\":15}]", Person
[].class);
Arrays
.stream(personArr
).forEach(System
.out
:: print
);
System
.out
.println();
List
<Person> personList
= gson
.fromJson("[{\"name\":\"Bob\", \"age\":13},{\"name\":\"Lala\", \"age\":15}]", new TypeToken<Collection
<Person>>(){}.getType());
System
.out
.println("==============obj2JsonStr=============");
String jsonString
= gson
.toJson(person
);
System
.out
.println(jsonString
);
String mapJson
= gson
.toJson(map
);
System
.out
.println(mapJson
);
String personJson
= gson
.toJson(personList
);
System
.out
.println(personJson
);
直接操作,不转对象
JsonElement element
= JsonParser
.parseString("{\n" +
" \"sex\": '男',\n" +
" \"hobby\":[\"baskte\",\"tennis\"],\n" +
" \"introduce\": {\n" +
" \"name\":\"tom\",\n" +
" \"age\":23\n" +
" }\n" +
" }");
if (element
.isJsonObject()) {
JsonObject object
= element
.getAsJsonObject();
String sex
= object
.get("sex").getAsString();
System
.out
.println("sex:" + sex
);
JsonArray hobbies
= object
.getAsJsonArray("hobby");
for (int i
= 0; i
< hobbies
.size(); i
++) {
String hobby
= hobbies
.get(i
).getAsString();
System
.out
.println("hobby:" + hobby
);
}
JsonObject introduce
= object
.getAsJsonObject("introduce");
String name
= introduce
.get("name").getAsString();
int age
= introduce
.get("age").getAsInt();
System
.out
.println("name:" + name
+";age:" + age
);
注解
fastjson
FastJson是阿里巴巴公司提供的一个用Java语言编写的高性能功能完善的JSON库
缺陷: 很多漏洞
String time
= "2070-01-01 00:00:00";
String time
= "1970-01-01 00:00:00.000000000.000000000";
com
.alibaba
.fastjson
.JSONObject jsonObject
= new com.alibaba.fastjson.JSONObject();
jsonObject
.put("time", time
);
Timestamp timestamp
= jsonObject
.getTimestamp("time");
System
.out
.println("time:" + timestamp
);