从 Json 到对象,Java
From Json to Object, Java
我有一个 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.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 不是面向行的数据格式,尝试逐行读取它是行不通的。您可以一次将整个文件全部交给 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
class 中的列表更改为其他内容,或者完全删除 Foglio1
class。在不知道你程序的其余部分的情况下,这是不可能的。
我有一个 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.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 不是面向行的数据格式,尝试逐行读取它是行不通的。您可以一次将整个文件全部交给 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
class 中的列表更改为其他内容,或者完全删除 Foglio1
class。在不知道你程序的其余部分的情况下,这是不可能的。