使用 Jackson 将 Json 数组拆分为单个 Json 元素
Splitting Json array to individual Json elements using Jackson
有没有什么方法可以使用 Jackson 库将给定的 Json 数组拆分为单个 Json 元素?例如,我有这个 Json 数组:
[
{
"key1":"value11",
"key2":"value12"
},
{
"key1":"value21",
"key2":"value22"
}
]
拆分后我想要一个单独元素的列表,例如:
{
"key1":"value11",
"key2":"value12"
}
和
{
"key1":"value21",
"key2":"value22"
}
你可能想看看这个API
最后,我找到了一个有效的解决方案:
public List<String> split(String jsonArray) throws Exception {
List<String> splittedJsonElements = new ArrayList<String>();
ObjectMapper jsonMapper = new ObjectMapper();
JsonNode jsonNode = jsonMapper.readTree(jsonArray);
if (jsonNode.isArray()) {
ArrayNode arrayNode = (ArrayNode) jsonNode;
for (int i = 0; i < arrayNode.size(); i++) {
JsonNode individualElement = arrayNode.get(i);
splittedJsonElements.add(individualElement.toString());
}
}
return splittedJsonElements;
}
这个问题的一个很好的解决方案是使用 Java 8 Streaming API:s 进行迭代。 JsonNode
对象是 Iterable
,其中 spliterator
方法可用。所以,可以使用下面的代码:
public List<String> split(final String jsonArray) throws IOException {
final JsonNode jsonNode = new ObjectMapper().readTree(jsonArray);
return StreamSupport.stream(jsonNode.spliterator(), false) // Stream
.map(JsonNode::toString) // map to a string
.collect(Collectors.toList()); and collect as a List
}
另一种选择是跳过重新映射(对 toString
的调用),而是 return 一个 List<JsonNode>
元素。这样您就可以使用 JsonNode
方法来访问数据(get
、path
等等)。
这似乎是作者所要求的。我使用 Jackon 库的 toString 方法将 JSON 列表分成两个字符串。
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
...
...
String jsonText = "[{\"test\":1},{\"test2\":2}]";
int currentElement = 0;
int elementCount;
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonObj = mapper.readTree(jsonText);
elementCount = jsonObj.size();
while (currentElement<elementCount) {
System.out.println(jsonObj.get(currentElement).toString());
currentElement++;
}
这是一行:
new ObjectMapper().readTree(json).forEach(node -> System.out.println(node.toString()));
有没有什么方法可以使用 Jackson 库将给定的 Json 数组拆分为单个 Json 元素?例如,我有这个 Json 数组:
[
{
"key1":"value11",
"key2":"value12"
},
{
"key1":"value21",
"key2":"value22"
}
]
拆分后我想要一个单独元素的列表,例如:
{
"key1":"value11",
"key2":"value12"
}
和
{
"key1":"value21",
"key2":"value22"
}
你可能想看看这个API
最后,我找到了一个有效的解决方案:
public List<String> split(String jsonArray) throws Exception {
List<String> splittedJsonElements = new ArrayList<String>();
ObjectMapper jsonMapper = new ObjectMapper();
JsonNode jsonNode = jsonMapper.readTree(jsonArray);
if (jsonNode.isArray()) {
ArrayNode arrayNode = (ArrayNode) jsonNode;
for (int i = 0; i < arrayNode.size(); i++) {
JsonNode individualElement = arrayNode.get(i);
splittedJsonElements.add(individualElement.toString());
}
}
return splittedJsonElements;
}
这个问题的一个很好的解决方案是使用 Java 8 Streaming API:s 进行迭代。 JsonNode
对象是 Iterable
,其中 spliterator
方法可用。所以,可以使用下面的代码:
public List<String> split(final String jsonArray) throws IOException {
final JsonNode jsonNode = new ObjectMapper().readTree(jsonArray);
return StreamSupport.stream(jsonNode.spliterator(), false) // Stream
.map(JsonNode::toString) // map to a string
.collect(Collectors.toList()); and collect as a List
}
另一种选择是跳过重新映射(对 toString
的调用),而是 return 一个 List<JsonNode>
元素。这样您就可以使用 JsonNode
方法来访问数据(get
、path
等等)。
这似乎是作者所要求的。我使用 Jackon 库的 toString 方法将 JSON 列表分成两个字符串。
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
...
...
String jsonText = "[{\"test\":1},{\"test2\":2}]";
int currentElement = 0;
int elementCount;
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonObj = mapper.readTree(jsonText);
elementCount = jsonObj.size();
while (currentElement<elementCount) {
System.out.println(jsonObj.get(currentElement).toString());
currentElement++;
}
这是一行:
new ObjectMapper().readTree(json).forEach(node -> System.out.println(node.toString()));