如何解析JSONArray中的JSON对象?

时间:2017-11-22 13:42:41

标签: java arrays json text

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

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

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

您能帮助我如何使用Java解析此文件。我想读取每个JSON对象并显示所有fullname和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();
  }
 }

5 个答案:

答案 0 :(得分:2)

您的json是一个JSONArray,因此当您解析它时,需要将其解析为JSONArray

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

答案 1 :(得分:1)

好的伙计......刚刚解决了我的问题。我发布解决方案以防有人再次遇到同样的问题,可以使用我的解决方案。我的解决方案部分是由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();
        }

答案 2 :(得分: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>

答案 3 :(得分:0)

我建议和杰克逊一起去,特别是Jackson Streaming API,它非常适合解析像这样的大型数组。

请参阅此答案:https://stackoverflow.com/a/24838392/3765428

答案 4 :(得分:0)

你可以使用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);

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