我有一个JSON文件:“data.json”包含大约600个具有属性的对象的JSONArray:别名,电话,类型,建筑物和标题。我正在尝试从阵列中的对象中删除所有别名和电话属性。
以下是一个示例:
[
{
"Title": "7 Eleven",
"Alias": "Seven Eleven",
"Building": "7 Eleven"
},
{
"Title": "Adaptive Computing Research Lab",
"Alias": "acrl",
"Type": "Faculty",
"Building": "COM1"
},
{
"Title": "Alcove.Asian Restaurant Bar",
"Building": "University Cultural Centre"
},
{
"Title": "Algorithms Research Lab",
"Alias": "arl",
"Type": "Faculty",
"Building": "COM1"
}
]
我明白这是一个JsonArray所以我必须解析它是一个JsonArray类型而不是JsonObject所以解析不是问题。但是当我使用这段代码时
import javax.json.*;
import java.io.FileNotFoundException;
import java.io.FileReader;
public static void main(String args[]) throws FileNotFoundException {
JsonReader reader = Json.createReader(new FileReader("data.json"));
JsonArray jsonArray = (JsonArray) reader.read();
for (int i = 0; i < jsonArray.size(); i++) {
JsonObject o = (JsonObject) jsonArray.get(i);
if (o.containsKey("Alias"))
o.remove("Alias");
if (o.containsKey("Telephone"))
o.remove("Telephone");
System.out.println(jsonArray);
}
}
我有这个错误
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableMap$UnmodifiableEntrySet$1.remove(Collections.java:1664)
at java.util.AbstractMap.remove(AbstractMap.java:254)
at JSONEditor.main(JSONEditor.java:20)
我不明白为什么它是不可修改的。
到目前为止,我已经在StackOverflow和文档中查看了许多其他类似的问题和答案,这些问题和答案表明我正在尝试做的事情是可能的,但我仍然不明白为什么这对我不起作用。
答案 0 :(得分:1)
确定。这应该有所帮助,它是一个广为人知的库Jackson Databind
,您可以使用它来处理您的Json。下面是图书馆的链接。
https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind/2.8.8.1
以下是应该帮助您的代码。
请注意我放入src/main/resources
import java.io.File;
import java.io.IOException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
public class Main {
public static void main(String args[]) throws IOException {
Main main = new Main();
File file = main.getFile("data.json");
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(file);
for (JsonNode jsonNode : root) {
if (jsonNode instanceof ObjectNode) {
ObjectNode o = (ObjectNode) jsonNode;
o.remove("Alias");
o.remove("Telephone");
}
}
System.out.println(root);
}
private File getFile(String fileName) {
return new File(getClass().getClassLoader().getResource(fileName).getFile());
}
}
答案 1 :(得分:0)
这是基于您当前的代码。此代码构建一个新的JSONArray,它只包含您想要保留的数据。
try
{
File file = new File("data.json");
if(file.exists())
{
System.out.println(file.getAbsolutePath());
}
JsonReader reader = Json.createReader(new FileReader("data.json"));
JsonArray jsonArray = (JsonArray) reader.read();
JsonArrayBuilder jsonArrayBuilder = Json.createArrayBuilder();
//Build new json Array
for (int i = 0; i < jsonArray.size(); i++) {
String titleData = jsonArray.getJsonObject(i).get("Title") != null ? jsonArray.getJsonObject(i).get("Title").toString() : "";
String buildingData = jsonArray.getJsonObject(i).get("Building") != null ? jsonArray.getJsonObject(i).get("Building").toString() : "";
String typeData = jsonArray.getJsonObject(i).get("Type") != null ? jsonArray.getJsonObject(i).get("Type").toString() : "";
JsonObject object = Json.createObjectBuilder().add("Title", titleData).add("Building", buildingData).add("Type", typeData).build();
jsonArrayBuilder.add(object);
}
JsonArray newJSONArray = jsonArrayBuilder.build();
//print newJSONArray
for(JsonValue jsonValue : newJSONArray)
{
System.out.println(jsonValue);
}
}
catch (FileNotFoundException ex) {
System.out.println(ex.toString());
}