json的三个类库

    技术2023-09-05  131

    文章目录

    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);
    Processed: 0.017, SQL: 10