json的三個類庫


三種類庫的說明

  • 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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章