文章目录
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);
}
}