【问题标题】:From Json to Object, Java从 Json 到 Object,Java
【发布时间】:2020-07-31 15:50:55
【问题描述】:

我有一个 json 对象数组,看起来像这样(但有 30k 行):

{
    "Foglio1": [
        {
            "istat": "1001",
            "cap": "10011"
        },
        {
            "istat": "1002",
            "cap": "10060"
        },
        {
            "istat": "1003",
            "cap": "10070"
        },
        {
            "istat": "1004",
            "cap": "10010"
        },
        {
            "istat": "1006",
            "cap": "10040"
        }
     ]
}

我的课程:

public class Test {

    public static void main(String[] args) throws IOException {
        BufferedReader reader=new BufferedReader(new FileReader("italy_cap.json"));
        String cap=reader.readLine();
        Gson g = new Gson();
        Foglio1 p=null;
        while(cap!=null) {
            p = g.fromJson(cap, Foglio1.class);
            
            cap=reader.readLine();
        }
        System.out.println(p);
        
        
    }

}
public class Foglio1 {
    ArrayList <Cap> Foglio1;
}
public class Cap {
    String istat;
    String cap;
    
    public String getIstat() {
        return istat;
    }
    public void setIstat(String istat) {
        this.istat = istat;
    }
    public String getCap() {
        return cap;
    }
    public void setCap(String cap) {
        this.cap = cap;
    }
}

我想读取 json 并将其转换为 java 对象以进行解析,但我不知道如何使其工作。 它给我的错误是:

Exception in thread "main" com.google.gson.JsonSyntaxException: java.io.EOFException: End of input at line 1 column 14 path $.Foglio1[0]
    at com.google.gson.Gson.fromJson(Gson.java:937)
    at com.google.gson.Gson.fromJson(Gson.java:892)
    at com.google.gson.Gson.fromJson(Gson.java:841)
    at com.google.gson.Gson.fromJson(Gson.java:813)
    at net.codejava.ws.Test.main(Test.java:21)
Caused by: java.io.EOFException: End of input at line 1 column 14 path $.Foglio1[0]
    at com.google.gson.stream.JsonReader.nextNonWhitespace(JsonReader.java:1401)
    at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:549)
    at com.google.gson.stream.JsonReader.hasNext(JsonReader.java:414)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:81)
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
    at `enter code here`com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
    at com.google.gson.Gson.fromJson(Gson.java:927)

作为替代方案,你能给我一些关于大型 json 库的想法吗?

感谢您的帮助:)

【问题讨论】:

  • 您无法逐行读取 JSON 并尝试将 sn-ps 提供给它。将整个 JSON 对象的字符串(整个文件 italy_cap.json)提供给 Gson。

标签: java arrays json gson


【解决方案1】:

JSON 不是面向行的数据格式,尝试逐行读取它是行不通的。您可以一次将整个文件全部交给 Gson:

static void main(String[] args) throws IOException {
    try (BufferedReader reader=new BufferedReader(new FileReader("italy_cap.json"))) {
        Gson g = new Gson();
        Foglio1 p = g.fromJson(reader, Foglio1.class);
        System.out.println(p);
    }
}

如果您的 JSON 太大以至于您从中创建的对象无法放入内存,您可以切换到 reading it as a stream,但这可能需要对程序的其余部分进行大量更改。例如,您可能必须将Foglio1 类中的列表更改为其他内容,或者完全摆脱Foglio1 类。如果不知道程序的其余部分,就不可能说出来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    相关资源
    最近更新 更多