如何从.json文件中删除元素?

时间:2017-05-25 14:07:49

标签: java json

我有一个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和文档中查看了许多其他类似的问题和答案,这些问题和答案表明我正在尝试做的事情是可能的,但我仍然不明白为什么这对我不起作用。

2 个答案:

答案 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());
    }