【发布时间】:2013-11-14 14:58:32
【问题描述】:
我正在尝试在 Java 中解析 JSON 字符串并找到键值对,以便我可以确定 JSON 对象的大致结构,因为 JSON 字符串的对象结构是未知的。
例如,一个执行可能有一个像这样的 JSON 字符串:
{"id" : 12345, "days" : [ "Monday", "Wednesday" ], "person" : { "firstName" : "David", "lastName" : "Menoyo" } }
还有一个这样的:
{"url" : "http://someurl.com", "method" : "POST", "isauth" : false }
如何循环浏览各种 JSON 元素并确定键及其值?我查看了jackson-core 的JsonParser。我知道如何获取下一个“令牌”并确定它是什么类型的令牌(即字段名称、值、数组开始等),但是,我不知道如何获取实际令牌的值。
例如:
public void parse(String json) {
try {
JsonFactory f = new JsonFactory();
JsonParser parser = f.createParser(json);
JsonToken token = parser.nextToken();
while (token != null) {
if (token.equals(JsonToken.START_ARRAY)) {
logger.debug("Start Array : " + token.toString());
} else if (token.equals(JsonToken.END_ARRAY)) {
logger.debug("End Array : " + token.toString());
} else if (token.equals(JsonToken.START_OBJECT)) {
logger.debug("Start Object : " + token.toString());
} else if (token.equals(JsonToken.END_OBJECT)) {
logger.debug("End Object : " + token.toString());
} else if (token.equals(JsonToken.FIELD_NAME)) {
logger.debug("Field Name : " + token.toString());
} else if (token.equals(JsonToken.VALUE_FALSE)) {
logger.debug("Value False : " + token.toString());
} else if (token.equals(JsonToken.VALUE_NULL)) {
logger.debug("Value Null : " + token.toString());
} else if (token.equals(JsonToken.VALUE_NUMBER_FLOAT)) {
logger.debug("Value Number Float : " + token.toString());
} else if (token.equals(JsonToken.VALUE_NUMBER_INT)) {
logger.debug("Value Number Int : " + token.toString());
} else if (token.equals(JsonToken.VALUE_STRING)) {
logger.debug("Value String : " + token.toString());
} else if (token.equals(JsonToken.VALUE_TRUE)) {
logger.debug("Value True : " + token.toString());
} else {
logger.debug("Something else : " + token.toString());
}
token = parser.nextToken();
}
} catch (Exception e) {
logger.error("", e);
}
}
jackson 或其他库(gson 或 simple-json)中是否有一个类可以生成一棵树,或者允许循环遍历 json 元素并获取除值之外的实际键名?
【问题讨论】:
-
嗯,最简单的部分是解析成地图和列表——这是每一个合理的 JSON 解析器都可以做到的。当然,更难的部分是弄清楚数据的含义,如果每次都完全不同的话。
-
(如果您还没有这样做,请访问 json.org 并了解基本的 JSON 语法。所有值都是数字、布尔值、字符串、对象(映射)、数组或“null” -- 没有更复杂的了。)
-
感谢您的建议和链接。我实际上对 JSON 很熟悉;只是在没有注释的情况下不解析和/或立即转换到现有的 pojo 结构。
-
在世界其他地方,在 Java 之外,您就是这样做的。解析,取回一个通用对象,如有必要,请执行
instanceOf或其他任何操作以查看您得到的内容,然后从那里开始工作。您永远不会有完全未知的格式,但有时格式会因某些因素而异。