json的三个类库

文章目录

  • 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对象。

代码

//将json字符串转成对象
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=============");
//将对象转成json字符串
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)//忽然json字符串中的属性(对象字段的别名),
// ignoreUnknown忽略字段不匹配情况,相当于mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
public class Person {

@JsonProperty("name")//取别名对应json中属性
private String username;
private int age;
@JsonIgnore// 序列化和反序列化时忽略该字段
private String bar;
@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")//注解格式化日期格式
private Date date;
}
//将json字符串转成对象
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=============");
//将对象转成json字符串
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

代码

//将json字符串转成对象
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=============");
//将对象转成json字符串
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);

直接操作,不转对象

// json解析器,解析json数据
JsonElement element = JsonParser.parseString("{\n" +
"        \"sex\": '男',\n" +
"        \"hobby\":[\"baskte\",\"tennis\"],\n" +
"        \"introduce\": {\n" +
"            \"name\":\"tom\",\n" +
"            \"age\":23\n" +
"        }\n" +
"    }");
// json属于对象类型时
if (element.isJsonObject()) {
JsonObject object = element.getAsJsonObject();  // 转化为对象

// 1. value为string时,取出string
String sex = object.get("sex").getAsString();
System.out.println("sex:" + sex);

// 2. value为array时,取出array
JsonArray hobbies = object.getAsJsonArray("hobby");  //
for (int i = 0; i < hobbies.size(); i++) {
String hobby = hobbies.get(i).getAsString();
System.out.println("hobby:" + hobby);
}

// 3. value为object时,取出object
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);

你可能感兴趣的:(json)