【问题标题】:How do I parse JSON objects from a JSONArray?如何从 JSONArray 解析 JSON 对象?
【发布时间】:2017-11-22 13:42:40
【问题描述】:

我有一个非常大的 JSON 文件,格式如下:

[{"fullname": "name1", "id": "123"}, {"fullname": "name2", "id": "245"}, {"fullname": "name3", "id": "256"}]

它看起来像一个 JSONArray。所有的记录都写在同一行。

你能帮我如何使用 Java 解析这个文件吗?我想读取每个 JSON 对象并显示所有全名和 ID。以下是我的尝试,但我的代码不起作用:

import org.apache.commons.lang3.StringEscapeUtils;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JSONFileReaderDriver {

public static void main(String[] args) throws FileNotFoundException, 
IOException, ParseException 
{
 String filename="Aarau";
 String src="C:\\"+filename+".json";
 JSONParser parser = new JSONParser();
 JSONObject obj;
 try
    {
        BufferedReader br=new BufferedReader (new FileReader(src));  
        obj = (JSONObject) new JSONParser().parse(row);
        String fullname=obj.get("fullname");
        String id=obj.get("id");
        System.out.println ("fullname: "+fullname+" id: "+id);
    }catch(Exception e)
     {e.printStackTrace();}
   br.close();
  }
 }

【问题讨论】:

  • 如果解析简单,你打算使用像 gson 这样的库吗?
  • 您的代码在什么方面不起作用?您看到任何错误吗?
  • “但我的代码不起作用” - 具体是什么不起作用?是否有任何错误或异常?
  • 错误:在 org.json.simple.parser.JSONParser.parse 的 org.json.simple.parser.JSONParser.parse(JSONParser.java:257) 位置 0 处出现意外的标记 END OF FILE (JSONParser.java:81) 在 org.json.simple.parser.JSONParser.parse(JSONParser.java:75) 在 JSONReader.JSONFileReaderDriver.main(JSONFileReaderDriver.java:56)
  • [...].parse(row); - 什么是row

标签: java arrays json text


【解决方案1】:

让您的生活更轻松并使用ObjectMapper。 这样,您只需定义一个与您的 json 对象具有相同属性的 Pojo。

在你的情况下,你需要一个看起来像这样的 Pojo:

public class Person{
    private String fullname;
    private int id;

    public Person(String fullname, int id) {
        this.fullname = fullname;
        this.id = id;
    }

    public String getFullname() {
        return fullname;
    }

    public int getId() {
        return id;
    }
}

你只需要这样做:

ObjectMapper objectMapper = new ObjectMapper();
List<Person> persons = objectMapper.readValue(myInputStream, TypeFactory.defaultInstance().constructCollectionType(List.class, Person.class));

这是一种轻松且类型安全的方法。

需要的依赖:

https://github.com/FasterXML/jackson-databind

<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
</dependency>

【讨论】:

    【解决方案2】:

    你可以使用 Json.simple java api ,下面是对你有帮助的代码

            byte[] bFile = Files.readAllBytes(new File("C:/xyz.json").toPath());
            JSONArray root = (JSONArray) JSONValue.parseWithException(bFile);
            JSONObject rootObj = (JSONObject) root.get(0);
    

    您可以根据 key 从 JSONObject 获取值,它还取决于您的 json 格式,因为可能存在嵌套的 json 数据。所以你必须相应地提取数据。除此之外,您还可以使用 jackson parser api 或 GS​​ON。

    【讨论】:

      【解决方案3】:

      好的,伙计们...刚刚解决了我的问题。如果有人再次遇到同样的问题,我会发布解决方案,可以使用我的解决方案。我的解决方案部分是由 Rahul Rabhadiya 推动的。谢谢,伙计。

      try{
       row=br.readLine();
                  JSONArray root = (JSONArray) JSONValue.parseWithException(row);
      
                  for (int i=0;i<root.size();i++)
                  {
      
                  JSONObject rootObj = (JSONObject) root.get(i);
                  String fullname=(String) rootObj.get("fullname");
      
                  System.out.println (fullname);
                  }
          }catch(Exception e)
               {
              e.printStackTrace();
              }
      

      【讨论】:

      • 您应该将答案归功于 Rahul Rabhadiya,因为他在您之前提出了这个解决方案。
      【解决方案4】:

      你的 json 是一个 JSONArray,所以当你解析它时,你需要将它解析为一个 JSONArray

              JSONParser jsonParser = new JSONParser();
              JSONArray a = (JSONArray) jsonParser.parse(new FileReader(src));
              for (Object o : a) {
                  // access your object here. 
              }
      

      【讨论】:

        【解决方案5】:

        我建议使用 Jackson,尤其是 Jackson Streaming API,它非常适合解析这样的大型数组。

        看到这个答案:https://stackoverflow.com/a/24838392/3765428

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-18
          • 1970-01-01
          • 2012-09-28
          相关资源
          最近更新 更多