使用jackson删除JSON元素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用jackson删除JSON元素相关的知识,希望对你有一定的参考价值。
我有一个特定的JSON节点,对应于导入org.codehaus.jackson.JsonNode,而不是导入org.codehaus.jackson.map.JsonNode。
[
{
"givenName": "Jim",
"formattedName": "jimJackson",
"familyName": null,
"middleName": "none",
"honorificPrefix": "mr",
"honorificSuffix": "none"
},
{
"givenName": "john",
"formattedName": "johnLasher",
"familyName": null,
"middleName": "none",
"honorificPrefix": "mr",
"honorificSuffix": "none"
},
{
"givenName": "carlos",
"formattedName": "carlosAddner",
"familyName": null,
"middleName": "none",
"honorifiPrefix": "mr",
"honorificSuffix": "none"
},
{
"givenName": "lisa",
"formattedName": "lisaRay",
"familyName": null,
"middleName": "none",
"honorificPrefix": "mrs",
"honorificSuffix": "none"
},
{
"givenName": "bradshaw",
"formattedName": "bradshawLion",
"familyName": null,
"middleName": "none",
"honorificPrefix": "mr",
"honorificSuffix": "none"
},
{
"givenName": "phill",
"formattedName": "phillKane",
"familyName": null,
"middleName": "none",
"honorificPrefix": "mr",
"honorificSuffix": "none"
},
{
"givenName": "Gabriel",
"formattedName": "gabrielMoosa",
"familyName": null,
"middleName": "none",
"honorificPrefix": "mr",
"honorificSuffix": "none"
}
]
我想从上面数组的所有JSON节点中删除“familyName”和“middleName”。有没有办法实现这个目标?
我没有对此进行测试,但我认为这样的事情会做你想要的:
import org.codehaus.jackson.node.ObjectNode;
// ...
for (JsonNode personNode : rootNode) {
if (personNode instanceof ObjectNode) {
ObjectNode object = (ObjectNode) personNode;
object.remove("familyName");
object.remove("middleName");
}
}
您也可以使用Jackon的原始解析API更有效地执行此操作,但代码会更加混乱。
According to the JSONObject documentation,JSONObject实现Map.remove,它返回存储在该键的值。像它一样使用它
JSONObject json = new JSONObject();
json.put("key", "value");
String str = (String)json.remove("key");
gsteff编写的答案也可以使用,但我认为更简单的方法是使用对象映射器转换为JSONArray而不是JsonNode并从那里开始。
ObjectMapper mapper = new ObjectMapper();
String stringJsonArray = mapper.writeValueAsString(list);
JSONArray csvDatabindedtoBean = new JSONArray(stringJsonArray);
JSONArray finalArray = new JSONArray();
for (int val = 0; val < csvDatabindedtoBean.length(); val++) {
JSONObject finalObject = csvDatabindedtoBean.getJSONObject(val);
finalObject.remove("familyName");
finalObject.remove("middleName");
}
finalArray.put(finalObject);
}
我最近遇到了这个问题,因为我有一个不寻常的JSON,我需要删除一个元素:
{
"allan": { "score": 88 },
"bill": { "score": 75 },
"cassie": { "score": 96 },
"warnings": [ { "name": "class_low_numbers", "message": "this class is has less than 10 students" }]
}
前三个元素代表一个人和一个相应的分数对象。最后一个“警告”与得分对象不匹配,这是我想删除的那个。
从上面的gsteff的答案中取出rootNode作为起始JsonNode,我发现删除它的方法是遍历每个节点,将节点的对象映射版本添加到HashMap,这是我想要的返回对象,除非它是“警告”元素:
HashMap<String, ScoreDetails> results = new HashMap<String, ScoreDetails>();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields();
while (fields.hasNext()) {
Map.Entry<String, JsonNode> next = fields.next();
if (!next.getKey().equals("warnings")) {
results.put(
next.getKey(), mapper.treeToValue(next.getValue(), ScoreDetails.class));
}
}
return results;
Jackson的ObjectMapper只用了几步就能给出解决方案。
将json数据保存在一个名为'data.json'的文件中。将代码复制到没有import语句的函数中并调用该函数。生成的JSON将写入新文件'data1.json'。
import java.io.File;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(new File("data.json"));
for (JsonNode node : jsonNode) {
((ObjectNode)node).remove("familyName");
((ObjectNode)node).remove("middleName");
}
objectMapper.writeValue(new File("data1.json"), jsonNode);
您可以创建一个新的JSONObject,读取除“familyName”和“middleName”之外的所有节点,然后将它们全部保存到新文件中。这是一个例子。 JSON.Simple Example – Read And Write JSON
以上是关于使用jackson删除JSON元素的主要内容,如果未能解决你的问题,请参考以下文章
Gson、FastJson、Jackson、json-lib对比总结
使用 Jackson 和 Spring 将 JavaScript 数组反序列化为 Java LinkedHashSet 不会删除重复项