jackson学习

文章目录

TestJsonToken

java 复制代码
public class TestJsonToken {


    public static void main(String[] args) throws Exception {

        String json = """
                {
                  "name": "张三",
                  "age": 25,
                  "scores": [90.5, 85.0],
                  "active": true,
                  "address": null
                }
                """;

        JsonFactory factory = new JsonFactory();
        try (JsonParser parser = factory.createParser(json)) {
            // 初始状态没有 token,需要调用 nextToken() 开始
            while (parser.nextToken() != null) {              // null 表示结束
                JsonToken token = parser.currentToken();     // 当前 token
                String fieldName = parser.getCurrentName();  // 如果是JsonToken.FIELD_NAME字段名,这里会有

                if (token == JsonToken.FIELD_NAME) {
                    System.out.print("字段名: " + fieldName + " -> ");
                } else if (token.isScalarValue()) { // VALUE_STRING, VALUE_NUMBER_INT, ... 都是标量
                    System.out.println("值: " + parser.getText());
                } else if (token == JsonToken.START_OBJECT) {
                    System.out.println("开始对象");
                } else if (token == JsonToken.END_OBJECT) {
                    System.out.println("结束对象");
                } else if (token == JsonToken.START_ARRAY) {
                    System.out.print(fieldName + " 数组开始: [");
                    // 内部循环读取数组元素,直到 END_ARRAY
                    while (parser.nextToken() != JsonToken.END_ARRAY) {
                        System.out.print(parser.getText() + " ");
                    }
                    System.out.println("]");
                }
            }
        }
    }


}

TestTreeNode

java 复制代码
public class TestTreeNode {

    public static void main(String[] args) {

        String json = """
                {
                  "name": "张三",
                  "age": 25,
                  "scores": [90, 85],
                  "address": {
                    "city": "深圳",
                    "zip": "518000"
                  },
                  "active": true,
                  "spouse": null
                }
                """;

        ObjectMapper mapper = new ObjectMapper();
        try {
            JsonNode root = mapper.readTree(json);

            // 获取指定JsonNode的所属JsonToken类型
            // JsonNode#asToken => JsonToken
            // 直接解析json数据
            System.out.println(root.asToken());                // START_OBJECT
            System.out.println(root.get("name").asToken());    // VALUE_STRING
            System.out.println(root.get("age").asToken());     // VALUE_NUMBER_INT
            System.out.println(root.get("scores").asToken());  // START_ARRAY
            System.out.println(root.get("active").asToken());  // VALUE_TRUE
            System.out.println(root.get("spouse").asToken());  // VALUE_NULL
            // System.out.println(root.get("unknown").asToken()); // 错误,空指针异常
            System.out.println(root.path("unknown").asToken()); // NOT_AVAILABLE
            // 直接解析值
            System.out.println(mapper.readTree("\"abc\"").asToken()); // VALUE_STRING
            // System.out.println(mapper.readTree("abc").asToken());          // 错误,字符串值必须要加双引号
            System.out.println(mapper.readTree("null").asToken());    // VALUE_NULL
            System.out.println(mapper.readTree("null") == NullNode.instance); // true
            System.out.println(mapper.readTree("12.3").asToken());    // VALUE_NUMBER_FLOAT
            System.out.println(mapper.readTree("3").asToken());       // VALUE_NUMBER_INT
            System.out.println(mapper.readTree("\"3\"").asToken());   // VALUE_STRING
            System.out.println(mapper.readTree("true").asToken());    // VALUE_TRUE
            System.out.println(mapper.readTree("TRUE").asToken());    // 错误,字符串值必须要加双引号
            System.out.println(mapper.readTree("{}").asToken());      // START_OBJECT
            // System.out.println(mapper.readTree("{1}").asToken());          // 错误,必须符合json格式
            System.out.println(mapper.readTree("[]").asToken());      // START_ARRAY
            // System.out.println(mapper.readTree("[1,a]").asToken());        // 错误,必须符合json格式
            // System.out.println(mapper.readTree("]").asToken());            // 错误,必须符合json格式
            System.out.println(mapper.readTree("").asToken());        // NOT_AVAILABLE,这里解析出来是MissingNode
            System.out.println(mapper.readTree(" ").asToken());       // NOT_AVAILABLE
            System.out.println(mapper.readTree(" \n").asToken());     // NOT_AVAILABLE
            System.out.println(mapper.readTree("\"\"").asToken());    // VALUE_STRING
            // System.out.println(mapper.readTree("\"").asToken());           // 错误
            // System.out.println(mapper.readTree((String) null).asToken());  // 错误,不能为 null

            // 获取数值节点的数值类型
            // JsonNode#numberType
            System.out.println(root.get("age").numberType()); // INT
            System.out.println(mapper.readTree("12.3").numberType()); // DOUBLE
            // 如果是 3.14,则输出 DOUBLE
            // 对于非数值节点,返回 null
            System.out.println(root.get("name").numberType()); // null
            System.out.println(mapper.readTree("\"abc\"").numberType()); // null

            // 获取对象/数组节点的元素数量
            // JsonNode#size
            System.out.println(root.size());                                // 6 (6个字段)
            System.out.println(root.get("scores").size());                  // 2 (两个元素)
            System.out.println(root.get("address").size());                 // 2 (city, zip)
            System.out.println(root.get("name").size());                    // 0 (值节点)
            System.out.println(mapper.readTree("\"hello\"").size());// 0

            // 判断节点是否是值节点
            System.out.println(root.isValueNode());                  // false (对象)
            System.out.println(root.get("name").isValueNode());      // true
            System.out.println(root.get("scores").isValueNode());    // false (数组)
            System.out.println(root.get("spouse").isValueNode());    // true (NullNode 也是值节点)
            System.out.println(mapper.readTree("null").isValueNode());    // true
            System.out.println(mapper.readTree("{\"x\":true, \"y\":null}").path("y").isValueNode());    // true
            System.out.println(mapper.readTree("{\"x\":true, \"y\":null}").path("z").isValueNode());    // false

            // 判断节点是否是容器节点
            System.out.println(root.isContainerNode());                             // true
            System.out.println(root.get("name").isContainerNode());                 // false
            System.out.println(mapper.readTree("[]").isContainerNode());    // true
            // System.out.println(mapper.readTree("[]").get(2).isContainerNode());  // 错误,空指针异常
            System.out.println(mapper.readTree("[]").path(2).isContainerNode());  // true
            System.out.println(mapper.readTree("{}").isContainerNode());    // true

            // 判断节点是否是对象节点
            System.out.println(root.isObject());                       // true
            System.out.println(root.get("address").isObject());        // true
            System.out.println(root.get("scores").isObject());         // false (数组)

            // 判断节点是否是数组节点
            System.out.println(root.get("scores").isArray());          // true
            System.out.println(root.isArray());                        // false
            System.out.println(mapper.readTree("[1]").isArray()); // true

            // 获取节点中指定字段名的子节点
            System.out.println(root.get("name"));                              // "张三"
            System.out.println(root.get("name").isValueNode());                // true
            System.out.println(root.get("scores"));                            // [90,85]
            System.out.println(root.get("scores").isArray());                  // true
            System.out.println(root.get("unknown"));                           // null
            System.out.println(mapper.readTree("").isMissingNode());   // true
            System.out.println(mapper.readTree("") == MissingNode.getInstance()); // true
            System.out.println(mapper.readTree("").get("a") == null);   // true
            System.out.println(mapper.readTree("3.14").get("unknown")); // null
            System.out.println(mapper.readTree("{}").get("unknown"));   // null
            System.out.println(mapper.readTree("{\"name\":null}"));     // 是1个ObjectNode
            System.out.println(mapper.readTree("{\"name\":null}").get("name") == NullNode.getInstance()); // true
            System.out.println(mapper.readTree("{\"name\":null}").get("name").get("a") == null); // true
            System.out.println(mapper.readTree("{\"name\":null}").isNull()); // true
            System.out.println(mapper.readTree("{\"name\":null}").get("unknown")); // null

            // 获取节点中指定索引的子节点
            ArrayNode scores = (ArrayNode) root.get("scores");
            System.out.println(scores.get(0)); // 90
            System.out.println(scores.get(1)); // 85
            System.out.println(scores.get(2)); // null (越界返回 null)
            System.out.println(mapper.readTree("[]").get(5));   // null (越界返回 null)
            System.out.println(mapper.readTree("{}").get(5));   // null (对对象节点调用会返回 null)
            System.out.println(mapper.readTree("3.14").get(5)); // null (对值节点调用会返回 null)
            System.out.println(NullNode.getInstance().get(5));          // null
            System.out.println(MissingNode.getInstance().get(5));       // null


            // 获取(安全的)节点中指定字段名的子节点
            // 安全访问深层路径,即使中间节点不存在也不会报 NPE
            System.out.println(root.path("address").path("city"));       // "深圳"
            System.out.println(root.path("unknown").isMissingNode());              // true
            System.out.println(root.path("a") == MissingNode.getInstance());       // true
            System.out.println(root.path("a").path("b") == MissingNode.getInstance()); // true
            System.out.println(mapper.readTree("[]").path("a").isMissingNode());   // true
            System.out.println(mapper.readTree("{}").path("a").isMissingNode());   // true
            System.out.println(mapper.readTree("3.14").path("a").isMissingNode()); // true
            System.out.println(mapper.readTree("") == MissingNode.getInstance());    // true
            System.out.println(MissingNode.getInstance().asText());                          // 空字符串
            System.out.println(MissingNode.getInstance().path("a").isMissingNode());// true
            System.out.println(MissingNode.getInstance().path("a").path("b").isMissingNode());// true
            System.out.println(NullNode.getInstance().path("a") == null);// false
            System.out.println(NullNode.getInstance().path("a") == MissingNode.getInstance());// true

            // 获取(安全的)节点中指定索引的子节点
            System.out.println(root.path("scores").path(0));                 // 90
            System.out.println(root.path("scores").path(10).isMissingNode()); // true
            System.out.println(root.path("scores").path("a").isMissingNode()); // true
            System.out.println(root.path("scores").path("a").path(10).isMissingNode()); // true
            System.out.println(mapper.readTree("[]").path(0).isMissingNode());   // true
            System.out.println(mapper.readTree("{}").path(0).isMissingNode());   // true
            System.out.println(mapper.readTree("3.14").path(0).isMissingNode()); // true
            System.out.println(MissingNode.getInstance().path(0).isMissingNode()); // true
            System.out.println(NullNode.getInstance().path(0).isMissingNode());    // true


            // 对象节点的所有字段名的迭代器
            // 输出: name, age, scores, address, active, spouse (顺序可能不同)
            Iterator<String> fieldNames = root.fieldNames();
            while (fieldNames.hasNext()) {
                System.out.println(fieldNames.next());
            }
            System.out.println(mapper.readTree("[]").fieldNames().hasNext());  // false
            System.out.println(mapper.readTree("3.14").fieldNames().hasNext());// false
            Iterator<String> fieldedNames = mapper.readTree("{\"a\":{\"b\":{\"c\":\"d\"}}}").fieldNames();
            System.out.println(fieldedNames.next());// a
            System.out.println(fieldedNames.hasNext());// false

            // 使用 JSON Pointer 表达式 精确访问嵌套值
            // 根下 address 对象的 city 字段
            System.out.println(root.at("/address/city").asText()); // 深圳
            // 访问数组的第0个元素
            System.out.println(root.at("/scores/0").asInt()); // 90
            // 如果路径不存在,返回 MissingNode
            System.out.println(root.at("/unknown/field").isMissingNode()); // true
            System.out.println(root.at("/unknown/0/field").isMissingNode()); // true
            System.out.println(mapper.readTree("[]").at("/0").isMissingNode());   // true
            System.out.println(mapper.readTree("[]").at("/a").isMissingNode());   // true
            System.out.println(mapper.readTree("[]").at("/0/a").isMissingNode());   // true
            System.out.println(mapper.readTree("[]").at("/a/0").isMissingNode());   // true
            System.out.println(mapper.readTree("{}").at("/0").isMissingNode());   // true
            System.out.println(mapper.readTree("{}").at("/0/a").isMissingNode()); // true
            System.out.println(mapper.readTree("{}").at("/a/0").isMissingNode()); // true
            System.out.println(mapper.readTree("3.14").at("/0").isMissingNode()); // true
            System.out.println(mapper.readTree("3.14").at("/a").isMissingNode()); // true
            System.out.println(mapper.readTree("3.14").at("/0/a").isMissingNode()); // true
            System.out.println(mapper.readTree("3.14").at("/a/0").isMissingNode()); // true
            System.out.println(MissingNode.getInstance().at("/0").isMissingNode());
            System.out.println(MissingNode.getInstance().at("/a").isMissingNode());
            System.out.println(NullNode.getInstance().at("/0").isMissingNode());
            System.out.println(NullNode.getInstance().at("/a").isMissingNode());

            // JsonNode转JsonParser
            JsonParser parser = root.get("address").traverse();
            // 现在可以像解析 JSON 流一样遍历该子树
            while (parser.nextToken() != null) {
                System.out.println(parser.currentToken() + ": " + parser.getText());
            }
            // 输出:
            // START_OBJECT
            // FIELD_NAME: city
            // VALUE_STRING: 深圳
            // FIELD_NAME: zip
            // VALUE_STRING: 518000
            // END_OBJECT
            JsonParser parser2 = mapper.readTree("[1,2,3]").traverse();
            while (parser2.nextToken() != null) {
                System.out.println(parser2.currentToken() + ": " + parser2.getText());
            }
            // START_ARRAY: [
            // VALUE_NUMBER_INT: 1
            // VALUE_NUMBER_INT: 2
            // VALUE_NUMBER_INT: 3
            // END_ARRAY: ]
            JsonNode root2 = mapper.readTree("{\"user\":{\"name\":\"张三\",\"age\":25}}");
            JsonNode userNode = root2.get("user");
            JsonParser parser1 = userNode.traverse(mapper); // 需要传递mapper进去
            while (parser1.nextToken() != null) {
                System.out.println(parser1.currentToken() + ": " + parser1.getText());
            }
            // START_OBJECT: {
            // FIELD_NAME: name
            // VALUE_STRING: 张三
            // FIELD_NAME: age
            // VALUE_NUMBER_INT: 25
            // END_OBJECT: }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }


    }

}

TestJsonNode

java 复制代码
public class TestJsonNode {

    public static void main(String[] args) throws Exception {

        String json = """
                {
                  "name": "张三",
                  "age": 25,
                  "scores": [90, 85],
                  "address": {
                    "city": "深圳",
                    "zip": "518000"
                  },
                  "active": true,
                  "spouse": null
                }
                """;

        ObjectMapper mapper = new ObjectMapper();
        /*

        System.out.println(mapper.readTree("").asToken());        // NOT_AVAILABLE
        System.out.println(mapper.readTree(" ").asToken());       // NOT_AVAILABLE
        System.out.println(mapper.readTree("null").asToken());    // VALUE_NULL
        System.out.println(mapper.readTree("\"null\"").asToken());// VALUE_STRING
        System.out.println(mapper.readTree("\"abc\"").asToken()); // VALUE_STRING
        // System.out.println(mapper.readTree("\"abc").asToken());// 错误
        // System.out.println(mapper.readTree("\"").asToken());   // 错误
        System.out.println(mapper.readTree("3").asToken());       // VALUE_NUMBER_INT
        System.out.println(mapper.readTree("\"3\"").asToken());   // VALUE_STRING
        System.out.println(mapper.readTree("3.14").asToken());    // VALUE_NUMBER_FLOAT
        System.out.println(mapper.readTree("{}").asToken());      // START_OBJECT
        System.out.println(mapper.readTree("[]").asToken());      // START_ARRAY
        System.out.println(mapper.readTree("true").asToken());    // VALUE_TRUE
        // System.out.println(mapper.readTree("TRUE").asToken()); // 错误
        */

        // mapper.readTree("")
        // mapper.readTree(" ")
        // mapper.readTree("null")
        // mapper.readTree("\"null\"")
        // mapper.readTree("\"abc\"")
        // mapper.readTree("3")
        // mapper.readTree("\"3\"")
        // mapper.readTree("3.14")
        // mapper.readTree("{\"a\":\"b\"}")
        // mapper.readTree("[1,\"c\"]")
        // mapper.readTree("true")

        System.out.println("------------asText-----------");
        System.out.println(mapper.readTree("").asText());                 // 空字符串
        System.out.println(mapper.readTree(" ").asText());                // 空字符串
        System.out.println(mapper.readTree("null").asText());             // 字符串null
        System.out.println(mapper.readTree("\"null\"").asText());         // 字符串null
        System.out.println(mapper.readTree("\"abc\"").asText());          // 字符串abc
        System.out.println(mapper.readTree("3").asText());                // 字符串3
        System.out.println(mapper.readTree("\"3\"").asText());            // 字符串3
        System.out.println(mapper.readTree("3.14").asText());             // 字符串3.14
        System.out.println(mapper.readTree("{\"a\":\"b\"}").asText());    // 空字符串
        System.out.println(mapper.readTree("[1,\"c\"]").asText());        // 空字符串
        System.out.println(mapper.readTree("true").asText());             // 字符串true


        System.out.println("------------isTextual-----------");
        System.out.println(mapper.readTree("").isTextual());              // false
        System.out.println(mapper.readTree(" ").isTextual());             // false
        System.out.println(mapper.readTree("null").isTextual());          // false
        System.out.println(mapper.readTree("\"null\"").isTextual());      // true
        System.out.println(mapper.readTree("\"abc\"").isTextual());       // true
        System.out.println(mapper.readTree("3").isTextual());             // false
        System.out.println(mapper.readTree("\"3\"").isTextual());         // true
        System.out.println(mapper.readTree("3.14").isTextual());          // false
        System.out.println(mapper.readTree("{\"a\":\"b\"}").isTextual()); // false
        System.out.println(mapper.readTree("[1,\"c\"]").isTextual());     // false
        System.out.println(mapper.readTree("true").isTextual());          // false

        System.out.println("------------textValue-----------");
        System.out.println(mapper.readTree("").textValue());             // null
        System.out.println(mapper.readTree(" ").textValue());            // null
        System.out.println(mapper.readTree("null").textValue());         // null
        System.out.println(mapper.readTree("\"null\"").textValue());     // null
        System.out.println(mapper.readTree("\"abc\"").textValue());      // abc
        System.out.println(mapper.readTree("3").textValue());            // null
        System.out.println(mapper.readTree("\"3\"").textValue());        // 3
        System.out.println(mapper.readTree("3.14").textValue());         // null
        System.out.println(mapper.readTree("{\"a\":\"b\"}").textValue());// null
        System.out.println(mapper.readTree("[1,\"c\"]").textValue());    // null
        System.out.println(mapper.readTree("true").textValue());         // null

        System.out.println("------------isInt-----------");
        System.out.println(mapper.readTree("").isInt());                 // false
        System.out.println(mapper.readTree(" ").isInt());                // false
        System.out.println(mapper.readTree("null").isInt());             // false
        System.out.println(mapper.readTree("\"null\"").isInt());         // false
        System.out.println(mapper.readTree("\"abc\"").isInt());          // false
        System.out.println(mapper.readTree("3").isInt());                // true
        System.out.println(mapper.readTree("\"3\"").isInt());            // false
        System.out.println(mapper.readTree("3.14").isInt());             // false
        System.out.println(mapper.readTree("{\"a\":\"b\"}").isInt());    // false
        System.out.println(mapper.readTree("[1,\"c\"]").isInt());        // false
        System.out.println(mapper.readTree("true").isInt());             // false

        System.out.println("------------intValue-----------");
        System.out.println(mapper.readTree("").intValue());              // 0
        System.out.println(mapper.readTree(" ").intValue());             // 0
        System.out.println(mapper.readTree("null").intValue());          // 0
        System.out.println(mapper.readTree("\"null\"").intValue());      // 0
        System.out.println(mapper.readTree("\"abc\"").intValue());       // 0
        System.out.println(mapper.readTree("3").intValue());             // 3
        System.out.println(mapper.readTree("\"3\"").intValue());         // 0
        System.out.println(mapper.readTree("3.14").intValue());          // 3
        System.out.println(mapper.readTree("{\"a\":\"b\"}").intValue()); // 0
        System.out.println(mapper.readTree("[1,\"c\"]").intValue());     // 0
        System.out.println(mapper.readTree("true").intValue());          // 0

        System.out.println("------------asInt-----------");
        System.out.println(mapper.readTree("").asInt());                 // 0
        System.out.println(mapper.readTree(" ").asInt());                // 0
        System.out.println(mapper.readTree("null").asInt());             // 0
        System.out.println(mapper.readTree("\"null\"").asInt());         // 0
        System.out.println(mapper.readTree("\"abc\"").asInt());          // 0
        System.out.println(mapper.readTree("3").asInt());                // 3
        System.out.println(mapper.readTree("\"3\"").asInt());            // 3
        System.out.println(mapper.readTree("3.14").asInt());             // 3
        System.out.println(mapper.readTree("{\"a\":\"b\"}").asInt());    // 0
        System.out.println(mapper.readTree("[1,\"c\"]").asInt());        // 0
        System.out.println(mapper.readTree("true").asInt());             // 1
        
        System.out.println("------------isBoolean-----------");
        System.out.println(mapper.readTree("").isBoolean());             // false
        System.out.println(mapper.readTree(" ").isBoolean());            // false
        System.out.println(mapper.readTree("null").isBoolean());         // false
        System.out.println(mapper.readTree("\"null\"").isBoolean());     // false
        System.out.println(mapper.readTree("\"abc\"").isBoolean());      // false
        System.out.println(mapper.readTree("3").isBoolean());            // false
        System.out.println(mapper.readTree("\"3\"").isBoolean());        // false
        System.out.println(mapper.readTree("3.14").isBoolean());         // false
        System.out.println(mapper.readTree("{\"a\":\"b\"}").isBoolean());// false
        System.out.println(mapper.readTree("[1,\"c\"]").isBoolean());    // false
        System.out.println(mapper.readTree("true").isBoolean());         // true

        System.out.println("------------asBoolean-----------");
        System.out.println(mapper.readTree("").asBoolean());             // false
        System.out.println(mapper.readTree(" ").asBoolean());            // false
        System.out.println(mapper.readTree("null").asBoolean());         // false
        System.out.println(mapper.readTree("\"null\"").asBoolean());     // false
        System.out.println(mapper.readTree("\"abc\"").asBoolean());      // false
        System.out.println(mapper.readTree("3").asBoolean());            // true
        System.out.println(mapper.readTree("\"3\"").asBoolean());        // false
        System.out.println(mapper.readTree("3.14").asBoolean());         // false
        System.out.println(mapper.readTree("{\"a\":\"b\"}").asBoolean());// false
        System.out.println(mapper.readTree("[1,\"c\"]").asBoolean());    // false
        System.out.println(mapper.readTree("true").asBoolean());         // true

        System.out.println("------------isNull-----------");
        System.out.println(mapper.readTree("").isNull());                // false
        System.out.println(mapper.readTree(" ").isNull());               // false
        System.out.println(mapper.readTree("null").isNull());            // true
        System.out.println(mapper.readTree("\"null\"").isNull());        // false
        System.out.println(mapper.readTree("\"abc\"").isNull());         // false
        System.out.println(mapper.readTree("3").isNull());               // false
        System.out.println(mapper.readTree("\"3\"").isNull());           // false
        System.out.println(mapper.readTree("3.14").isNull());            // false
        System.out.println(mapper.readTree("{\"a\":\"b\"}").isNull());   // false
        System.out.println(mapper.readTree("[1,\"c\"]").isNull());       // false
        System.out.println(mapper.readTree("true").isNull());            // false

    }

}

TestJsonParser

java 复制代码
ublic class TestJsonParser {

    public static void main(String[] args) throws Exception {

        String json = """
               {
                  "name": "张三",
                  "age": 25,
                  "scores": [90, 85],
                  "address": {
                    "city": "深圳",
                    "zip": "518000"
                  },
                  "active": true,
                  "spouse": null
                }
                """;

        // 生命周期方法
        JsonFactory factory = new JsonFactory();
        JsonParser parser = factory.createParser(json);
        System.out.println(parser.currentToken()); // null
        System.out.println(parser.isClosed()); // false
        // 如果关闭, 则parser.nextToken()会返回null
        // parser.close();
        while (parser.nextToken() != null) {
            JsonToken currJsonToken = parser.currentToken();
            System.out.printf("Token: %-20s Value: %s%n", currJsonToken, parser.getText());
            /*
              Token: START_OBJECT         Value: {
              Token: FIELD_NAME           Value: name
              Token: VALUE_STRING         Value: 张三
              Token: FIELD_NAME           Value: age
              Token: VALUE_NUMBER_INT     Value: 25
              Token: FIELD_NAME           Value: scores
              Token: START_ARRAY          Value: [
              Token: VALUE_NUMBER_INT     Value: 90
              Token: VALUE_NUMBER_INT     Value: 85
              Token: END_ARRAY            Value: ]
              Token: FIELD_NAME           Value: address
              Token: START_OBJECT         Value: {
              Token: FIELD_NAME           Value: city
              Token: VALUE_STRING         Value: 深圳
              Token: FIELD_NAME           Value: zip
              Token: VALUE_STRING         Value: 518000
              Token: END_OBJECT           Value: }
              Token: FIELD_NAME           Value: active
              Token: VALUE_TRUE           Value: true
              Token: FIELD_NAME           Value: spouse
              Token: VALUE_NULL           Value: null
              Token: END_OBJECT           Value: }
            */
        }
        // 当parser.nextToken() != null的循环结束后,Token流已经关闭
        System.out.println(parser.isClosed());     // true
        System.out.println(parser.currentToken()); // null
        // Token流已经关闭后, 可以再次关闭
        parser.close();

        // 配置方法
        JsonFactory factory2 = new JsonFactoryBuilder()
                .enable(JsonFactory.Feature.INTERN_FIELD_NAMES)
                .enable(JsonFactory.Feature.CANONICALIZE_FIELD_NAMES)
                .enable(JsonFactory.Feature.FAIL_ON_SYMBOL_HASH_OVERFLOW)
                .enable(JsonFactory.Feature.USE_THREAD_LOCAL_FOR_BUFFER_RECYCLING)
                .enable(JsonReadFeature.ALLOW_JAVA_COMMENTS)
                .enable(JsonReadFeature.ALLOW_YAML_COMMENTS)
                .enable(JsonReadFeature.ALLOW_SINGLE_QUOTES)
                .enable(JsonReadFeature.ALLOW_UNQUOTED_FIELD_NAMES)
                .enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS)
                .enable(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER)
                .enable(JsonReadFeature.ALLOW_LEADING_ZEROS_FOR_NUMBERS)
                .enable(JsonReadFeature.ALLOW_LEADING_DECIMAL_POINT_FOR_NUMBERS)
                .enable(JsonReadFeature.ALLOW_NON_NUMERIC_NUMBERS)
                .enable(JsonReadFeature.ALLOW_MISSING_VALUES)
                .enable(JsonReadFeature.ALLOW_TRAILING_COMMA)
                .enable(StreamReadFeature.AUTO_CLOSE_SOURCE)
                .enable(StreamReadFeature.STRICT_DUPLICATE_DETECTION)
                .enable(StreamReadFeature.IGNORE_UNDEFINED)
                .enable(StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION)
                .enable(JsonWriteFeature.QUOTE_FIELD_NAMES)
                .enable(JsonWriteFeature.WRITE_NAN_AS_STRINGS)
                .enable(JsonWriteFeature.WRITE_NUMBERS_AS_STRINGS)
                .enable(JsonWriteFeature.ESCAPE_NON_ASCII)
                .enable(StreamWriteFeature.AUTO_CLOSE_TARGET)
                .enable(StreamWriteFeature.AUTO_CLOSE_CONTENT)
                .enable(StreamWriteFeature.FLUSH_PASSED_TO_STREAM)
                .enable(StreamWriteFeature.WRITE_BIGDECIMAL_AS_PLAIN)
                .build();

        System.out.println("-------------hasCurrentToken-------------");
        JsonParser p1 = factory.createParser("{}");
        System.out.println(p1.hasCurrentToken()); // false,尚未调用 nextToken()
        p1.nextToken();
        System.out.println(p1.hasCurrentToken()); // true

        System.out.println("-------------getCurrentName-------------");
        JsonParser p2 = factory.createParser(json);
        while (p2.nextToken() != null) {
            System.out.println("---当前token: " + p2.currentToken() + "---");
            if (p2.currentToken() == JsonToken.FIELD_NAME) {
                System.out.println("字段名: " + p2.getCurrentName());
            } else {
                System.out.println("非字段名: " + p2.getCurrentName() + "," + p2.getText());
            }
        }
        /*
        ---当前token: START_OBJECT---
        非字段名: null,{
        ---当前token: FIELD_NAME---
        字段名: name
        ---当前token: VALUE_STRING---
        非字段名: name,张三
        ---当前token: FIELD_NAME---
        字段名: age
        ---当前token: VALUE_NUMBER_INT---
        非字段名: age,25
        ---当前token: FIELD_NAME---
        字段名: scores
        ---当前token: START_ARRAY---
        非字段名: scores,[
        ---当前token: VALUE_NUMBER_INT---
        非字段名: null,90
        ---当前token: VALUE_NUMBER_INT---
        非字段名: null,85
        ---当前token: END_ARRAY---
        非字段名: scores,]
        ---当前token: FIELD_NAME---
        字段名: address
        ---当前token: START_OBJECT---
        非字段名: address,{
        ---当前token: FIELD_NAME---
        字段名: city
        ---当前token: VALUE_STRING---
        非字段名: city,深圳
        ---当前token: FIELD_NAME---
        字段名: zip
        ---当前token: VALUE_STRING---
        非字段名: zip,518000
        ---当前token: END_OBJECT---
        非字段名: address,}
        ---当前token: FIELD_NAME---
        字段名: active
        ---当前token: VALUE_TRUE---
        非字段名: active,true
        ---当前token: FIELD_NAME---
        字段名: spouse
        ---当前token: VALUE_NULL---
        非字段名: spouse,null
        ---当前token: END_OBJECT---
        非字段名: null,}
        */

        System.out.println("-------------skipChildren-------------");
        parser = factory.createParser(json);
        while (parser.nextToken() != null) {
            if (parser.currentToken() == JsonToken.FIELD_NAME
                    && "scores".equals(parser.getCurrentName())) {
                parser.nextToken();    // 移动到 START_ARRAY
                parser.skipChildren(); // 跳过整个数组直到 END_ARRAY
                System.out.println("跳过了 scores 数组");
                continue;
            }
            System.out.println(parser.getText());
        }
        /*
        {
        name
        张三
        age
        25
        跳过了 scores 数组
        address
        {
        city
        深圳
        zip
        518000
        }
        active
        true
        spouse
        null
        }
        */
        parser = factory.createParser("{\"a\":\"b\",\"x\":\"y\"}");
        // parser初始获取的JsonToken是null
        System.out.println(parser.currentToken()); // null
        // 由于当前JsonToken是null, 直接skipChildren没有任何效果
        parser.skipChildren();
        System.out.println(parser.nextToken());    // START_OBJECT
        System.out.println(parser.currentToken()); // START_OBJECT
        // 移动到对象的{处后,然后跳到对象的}处
        parser.skipChildren();
        System.out.println(parser.currentToken()); // END_OBJECT

        parser = factory.createParser("[\"a\",{\"a\":\"b\",\"x\":\"y\"},\"e\"]");
        System.out.println(parser.currentToken()); // null
        parser.nextToken();
        System.out.println(parser.currentToken()); // START_ARRAY
        // 移动到数组的[处后,然后跳到数组的]处
        parser.skipChildren();
        System.out.println(parser.currentToken()); // END_ARRAY

        // 如果不从START_OBJECT/START_ARRAY开始跳,则无法跳过
        parser = factory.createParser("{\"a\":{\"b\":\"c\"}}");
        parser.nextToken();
        parser.nextToken();
        System.out.println(parser.currentToken()); // FIELD_NAME
        System.out.println(parser.getText());      // a
        parser.skipChildren(); // 此时没有任何效果
        System.out.println(parser.currentToken()); // FIELD_NAME
        System.out.println(parser.getText());      // a

        System.out.println("-------------nextFieldName-------------");
        parser = factory.createParser("{\"a\":{\"b\":\"c\"}}");
        // 该方法内部已经调用了nextToken(), 然后判断当前JsonToken是否是FIELD_NAME
        System.out.println(parser.nextFieldName()); // null
        parser.nextToken();
        System.out.println(parser.nextFieldName()); // null
        parser = factory.createParser("{\"a\":{\"b\":\"c\"}}");
        parser.nextToken();
        System.out.println(parser.nextFieldName()); // a

    }

}

TestJsonGenerator

java 复制代码
public class TestJsonGenerator {

    public static void main(String[] args) throws Exception {

        // 写 {}
        writeJson(generator->{
            try {
                generator.writeStartObject();
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // {"name":"zzhua173"}
        writeJson(generator->{
            try {
                generator.writeStartObject();
                // 写完name之后,一定要写值,不能写其它的
                generator.writeFieldName("name");
                generator.writeString("zzhua173");
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // {"name"}
        writeJson(generator->{
            try {
                generator.writeStartObject();
                generator.writeFieldName("name");
                // 此处忘记写入值
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // "zzhua"
        writeJson(generator->{
            try {
                // 上来就写值
                generator.writeString("zzhua");
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // {"name":3.1}
        writeJson(generator->{
            try {
                generator.writeStartObject();
                generator.writeFieldName("name");
                generator.writeNumber(3.1000D);
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // 写 {"name":"zzhua"}
        writeJson(generator->{
            try {
                generator.writeStartObject();
                generator.writeStringField("name", "zzhua");
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // {"name":null}
        writeJson(generator->{
            try {
                generator.writeStartObject();
                generator.writeNullField("name");
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // {"id":1001}
        writeJson(generator->{
            try {
                generator.writeStartObject();
                generator.writeNumberField("id", 1001);
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // {"flag":true}
        writeJson(generator->{
            try {
                generator.writeStartObject();
                generator.writeBooleanField("flag", true);
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // {"person":{"id":1,"name":"zzhua"}}
        writeJson(generator->{
            try {
                generator.writeStartObject();
                generator.writeFieldName("person");
                // JsonGenerator必须要设置ObjectCodec,才能写除基础类型的包装类的其它类型对象
                // 基础类型的包装类包括: null,String,Number,Long,Double,Float,Short,Byte,
                //                    BigInteger,BigDecimal,AtomicInteger,AtomicLong,
                //                    byte[],Boolean,AtomicBoolean
                generator.writeObject(new Person(1, "zzhua"));
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // {"map":{"name":"zzhua","id":1}}
        writeJson(generator->{
            try {
                generator.writeStartObject();
                generator.writeFieldName("map");
                HashMap<String, Object> data = new HashMap<>();
                data.put("id", 1);
                data.put("name", "zzhua");
                // JsonGenerator必须要设置ObjectCodec,才能写除基础类型的包装类的其它类型对象
                // 基础类型的包装类包括: null,String,Number,Long,Double,Float,Short,Byte,
                //                    BigInteger,BigDecimal,AtomicInteger,AtomicLong,
                //                    byte[],Boolean,AtomicBoolean
                generator.writeObject(data);
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // {}
        writeJson(generator->{
            try {
                // 这里只是将这个对象放入了OutputStreamContext上下文中的currentValue中,
                // 这个上下文可通过generator.getOutputContext()方法获取
                generator.writeStartObject(new Person(101, "zzhua"));
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // {"items":[]}
        writeJson(generator->{
            try {
                generator.writeStartObject();
                generator.writeFieldName("items");
                generator.writeStartArray();
                System.out.println(generator.getOutputContext().getCurrentName()); // "items"
                System.out.println(generator.getOutputContext().typeDesc());       // ARRAY
                generator.writeEndArray();
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // {"data":[1,2,3]}
        writeJson(generator->{
            try {
                generator.writeStartObject();
                generator.writeFieldName("data");
                // 注意:writeRaw 绕过了生成器的上下文校验,必须保证文本是合法的 JSON 片段。
                generator.writeRaw("[1,2,3]"); // 直接写入数组文本
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });

        // {"bytesContent":"MTIz"}
        writeJson(generator->{
            try {
                generator.writeStartObject();
                generator.writeBinaryField("bytesContent", "123".getBytes());
                generator.writeEndObject();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });


    }

    private static void writeJson(Consumer<JsonGenerator> consumer) throws IOException {
        StringWriter writer = new StringWriter();
        JsonGenerator generator = new JsonFactory().createGenerator(writer);
        generator.setCodec(new ObjectMapper());
        // generator.setPrettyPrinter(new DefaultPrettyPrinter());
        generator.setPrettyPrinter(new MinimalPrettyPrinter());
        consumer.accept(generator);
        generator.flush();
        generator.close();
        System.out.println(writer);
    }



}
相关推荐
NULL指向我2 小时前
STM32 F103C8T6学习笔记20:SPI驱动W25Qxx
笔记·stm32·学习
行走的蜗牛2 小时前
一文搞懂 Spring AI 核心接口,轻松对接所有大模型
java
吃好睡好便好2 小时前
汽车行驶原理
学习·汽车
吃好睡好便好2 小时前
Matlab中三种三维图的对比
开发语言·人工智能·学习·算法·matlab·信息可视化
倒流时光三十年2 小时前
PostgreSQL 中的 NULL 陷阱:从一次排除过滤说起
java·数据库·postgresql
代码改善世界2 小时前
【C++进阶】二叉搜索树
java·数据结构·c++
学习3人组2 小时前
业务主表+JSON自定义字段
java·spring boot·json
雨落在了我的手上2 小时前
初识java(六):方法的使用
java·开发语言
张敬之、2 小时前
sa-token
java