使用 Play Framework 和 Java 解析 Json 数组
Parsing a Json array using Play Framework and Java
我有以下 Json 结构:
{
"name": "John",
"surname": "Doe",
"languages": [
{"language": "english", "level": "3"},
{"language": "french", "level": "1"}
]
}
我正在使用Play Framework 解析Json HTTP 消息中的数据,该消息是使用自行开发的REST 服务发送的。我已经知道如何通过查看文档从 Json 数据中解析姓名和姓氏,这是通过以下方式完成的:
JsonNode json = request().body().asJson();
String name = json.findPath("name").textValue();
String surname = json.findPath("surname").textValue();
现在我的问题是,如何解析 Json 数据中的数组 "languages"。我找到了一些关于这个问题的其他帖子,但他们都在使用 Scala,我无法理解,所以最好我正在寻找 Java 解决方案。
我已经尝试了几件事,例如:
List<JsonNode> languages = json.findPath("languages").getElements();
根据文档 json.findPath() returns 一个 JsonNode,可以在其上调用函数 getElements(),它将 return 的迭代器Json节点。但是我在 getElements 上遇到编译错误:"The method getElements() is undefined for the type JsonNode"
有人知道解析这种数组的简单方法吗?
提前致谢
试试这个:
JsonNode node = (JsonNode)json.findPath("languages");
ArrayNode arr = (ArrayNode)node;
Iterator<JsonNode> it = arr.iterator();
while (it.hasNext()) {
JSONObject obj = it.next();
System.out.println("language: " + obj.findPath("language").getTextValue();
}
这里我只是打印其中一个元素,当然你可以随心所欲:)
希望对您有所帮助。
您可以像这样在 for-each 循环中执行此操作:
JsonNode json = request().body().asJson();
for (JsonNode language : json.withArray("languages")) {
Logger.info("language -> " + language.get("someField").asText());
//do something else
}
或者,如果您喜欢 lambda:
json.withArray("languages").forEach(language -> Logger.info("language -> " + language));
另外... 正确 创建 ArrayNode
:
的方法
//using a mapper(important subject the mapper is)
ObjectMapper mapper = new ObjectMapper();
ArrayNode array = mapper.createArrayNode();
//using an existing ArrayNode from a JsonNode
ArrayNode array = json.withArray("fieldName");
//or using Play's Json helper class
ArrayNode array = Json.newArray();
您真的应该阅读更多关于 jackson/fasterxml 的功能。这是一个非常 的高性能库。好的开始是 JacksonInFiveMinutes.
我有以下 Json 结构:
{
"name": "John",
"surname": "Doe",
"languages": [
{"language": "english", "level": "3"},
{"language": "french", "level": "1"}
]
}
我正在使用Play Framework 解析Json HTTP 消息中的数据,该消息是使用自行开发的REST 服务发送的。我已经知道如何通过查看文档从 Json 数据中解析姓名和姓氏,这是通过以下方式完成的:
JsonNode json = request().body().asJson();
String name = json.findPath("name").textValue();
String surname = json.findPath("surname").textValue();
现在我的问题是,如何解析 Json 数据中的数组 "languages"。我找到了一些关于这个问题的其他帖子,但他们都在使用 Scala,我无法理解,所以最好我正在寻找 Java 解决方案。
我已经尝试了几件事,例如:
List<JsonNode> languages = json.findPath("languages").getElements();
根据文档 json.findPath() returns 一个 JsonNode,可以在其上调用函数 getElements(),它将 return 的迭代器Json节点。但是我在 getElements 上遇到编译错误:"The method getElements() is undefined for the type JsonNode"
有人知道解析这种数组的简单方法吗? 提前致谢
试试这个:
JsonNode node = (JsonNode)json.findPath("languages");
ArrayNode arr = (ArrayNode)node;
Iterator<JsonNode> it = arr.iterator();
while (it.hasNext()) {
JSONObject obj = it.next();
System.out.println("language: " + obj.findPath("language").getTextValue();
}
这里我只是打印其中一个元素,当然你可以随心所欲:)
希望对您有所帮助。
您可以像这样在 for-each 循环中执行此操作:
JsonNode json = request().body().asJson();
for (JsonNode language : json.withArray("languages")) {
Logger.info("language -> " + language.get("someField").asText());
//do something else
}
或者,如果您喜欢 lambda:
json.withArray("languages").forEach(language -> Logger.info("language -> " + language));
另外... 正确 创建 ArrayNode
:
//using a mapper(important subject the mapper is)
ObjectMapper mapper = new ObjectMapper();
ArrayNode array = mapper.createArrayNode();
//using an existing ArrayNode from a JsonNode
ArrayNode array = json.withArray("fieldName");
//or using Play's Json helper class
ArrayNode array = Json.newArray();
您真的应该阅读更多关于 jackson/fasterxml 的功能。这是一个非常 的高性能库。好的开始是 JacksonInFiveMinutes.