从json文件中读取多个元素

ebl*_*lek 5 java file-io json gson

我有一个包含许多元素的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 }] 
}
Run Code Online (Sandbox Code Playgroud)

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

Pro*_*uce 9

物有所值...

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

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

input.json

{
"name":"A"
}
{
"name":"B"
}
Run Code Online (Sandbox Code Playgroud)

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<Thing> 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Thing: name=A
Thing: name=B
Run Code Online (Sandbox Code Playgroud)

更新:使用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));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这篇文章不正确.Gson确实有这个(错误的)功能.它叫做JsonStreamParser,文档在这里:http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/JsonStreamParser.html (2认同)

Sim*_*nni 3

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

但是,如果您无法更改现有格式,请将其视为“包含格式良好的 JSON 片段串联的字符串”。按照这种方式,将大字符串分解为更小的、有效的 json 字符串,然后一一解析它们。

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

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