我有一个非常大的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();
}
}
答案 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,它非常适合解析像这样的大型数组。
答案 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。