从json文件中读取多个元素

我有一个包含许多元素的json文件:

{ "code" : "hfuiew89", "type" : "location", "coordinates" : [ { "lat" : 40.9861, "lon" : 29.1046, "index" : 1 }, { "lat" : 40.9976, "lon" : 29.1153, "index" : 2 }, { "lat" : 40.9809, "lon" : 29.2194, "index" : 3 }] } { "code" : "klsdsjh", "type" : "location", "relatedTags" : [ "kolmha" ], "coordinates" : [ { "lat" : 40.9808, "lon" : 29.1605, "index" : 1 }, { "lat" : 40.9965, "lon" : 29.1672, "index" : 2 }] } 

我想用gson读取该文件,但我发现的所有示例仅适用于一个元素。 因此,在阅读第一个之后,抛出’预期的EOF’例外。 我怎么能克服这个?

Greg是对的,这是不正确的JSON,你应该尝试生成有效的JSON,在开头是前缀“[”,最后追加“]”,并用逗号(“,”)分隔每个元素,所以它是JSON对象的JSON数组。

但是,如果您无法更改格式,请将其视为“包含格式良好的JSON片段串联的字符串”。 以这种方式接近它,将大字符串分解为更小的有效json字符串,并逐个解析它们。

要将大字符串分成单个片段,您只需计算括号即可。 使用“预解析器”将东西复制到缓冲区(StringBuilder?),每次遇到“{”时递增计数器,每次进入“}”时递减计数器,如果计数器为零通过缓冲区字符串到gson进行解析,清除缓冲区并继续执行文件的末尾。

您甚至可以使用该预解析器将其转换为有效的json,只需在计数器达到零时附加“,”,并将所有内容传递给gson进行单次解析,但这可能意味着将所有内容加载到ram中,并且我不会不知道你的文件有多大。

物有所值…

以下陈述不正确。 Gson没有内置function来简单地处理这种JSON序列的反序列化。 (看评论。)

如果将JSON-to-from-Java API切换为一个选项, Jackson确实具有这样的function,如下所示。

input.json

 { "name":"A" } { "name":"B" } 

JacksonFoo.java

 import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.ANY; import static com.fasterxml.jackson.annotation.PropertyAccessor.FIELD; import java.io.File; import java.util.Iterator; import com.fasterxml.jackson.databind.ObjectMapper; public class JacksonFoo { public static void main(String[] args) throws Exception { ObjectMapper mapper = new ObjectMapper().setVisibility(FIELD, ANY); Iterator thingsIterator = mapper.reader(Thing.class).readValues(new File("input.json")); while (thingsIterator.hasNext()) { System.out.println(thingsIterator.next()); } } } class Thing { private String name; @Override public String toString() { return String.format("Thing: name=%s", name); } } 

输出:

 Thing: name=A Thing: name=B 

更新:使用Gson的类似解决方案。

GsonFoo.java

 import java.io.FileReader; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonStreamParser; public class GsonFoo { public static void main(String[] args) throws Exception { Gson gson = new GsonBuilder().create(); JsonStreamParser parser = new JsonStreamParser(new FileReader("input.json")); while(parser.hasNext()) { System.out.println(gson.fromJson(parser.next(), Thing.class)); } } }