Json文件解析但我仍然收到异常:预期BEGIN_OBJECT但是STRING

时间:2017-06-19 16:44:48

标签: java json parsing gson unmarshalling

修改 我已添加详细信息类并修复了重复键。日期实际上是字符串。

使用gson 2.8和eclipse。

我设法解析了JSON文件并存储和打印了值, 但我仍然得到例外。 (BEGIN_OBJECT预计但在第1行第2列STRING)

我检查了其他解决方案, 喜欢将对象放在预期的位置, 但它只是引发了一个不同的例外。例如(期望begin_array)

Json文件

[{"numValue1":"1",
"StringValue1":"EI",
"StringValue2":"A",
"enumValue1":"TYPE_A",
"numValue2":"3221",
"StringValue3":"DDEF",
"StringValue4":"Mexicof",
"numValue3":"8",
"stringDate1":"27/05/2017 11:55",
"stringDate2":"29/09/2016 11:55",
"stringDate3":"27/05/2017 11:57"}]

用于解析文件的代码

Gson gson = new GsonBuilder().setDateFormat("dd/MM/yyyy HH:mm").create();
Details[] feedRecord = gson.fromJson(data.trim(), Details[].class);

详细信息类

public class Details implements Serializable {

enum Type {
    TYPE_D, TYPE_A
};

@SerializedName("numValue1")
private Integer num1;
@SerializedName("StringValue1")
private String string1; 
@SerializedName("StringValue2")
private String string2; 
@SerializedName("numValue2")
private String num2;
@SerializedName("StringValue3")
private String string3;
@SerializedName("StringValue4")
private String string3;
@SerializedName("numValue3")
private String num3;
@SerializedName("StringDate1")
private String date1;
@SerializedName("StringDate2")
private String date2;
@SerializedName("StringDate3")
private String date3;
@SerializedName("enumType1")
private Type enumType;
}

异常

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 2 path $[0]
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
    at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:72)
    at com.google.gson.Gson.fromJson(Gson.java:887)
    at com.google.gson.Gson.fromJson(Gson.java:852)
    at com.google.gson.Gson.fromJson(Gson.java:801)
    at com.google.gson.Gson.fromJson(Gson.java:773)

1 个答案:

答案 0 :(得分:0)

使用JsonParser,例外是:(我修改了重复的密钥)

Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 252 path $
    at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1559) ~[gson-2.8.0.jar:na]

Gson api声明日期模式应遵循

http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html?is-external=true

这不会引发异常:

String str = "[{\"numValue1\":\"1\",\"StringValue1\":\"EI\",\"StringValue2\":\"A\",\"enumValue1\":\"TYPE_A\",\"numValue11\":\"3221\",\"StringValue4\":\"DDEF\",\"StringValue5\":\"Mexicof\",\"numValue2\":\"8\",\"stringDate1\":\"27/05/2017 11:55\",\"Date2\":\"29/09/2016 11:55\",\"Date3\":\"27/05/2017 11:57\"}]\"";
Gson gson = new GsonBuilder().setDateFormat("MM/dd/yyyy HH:mm").create();
JsonReader jr = gson.newJsonReader(new StringReader(str));


jr.beginArray();
jr.beginObject();
System.out.println(jr.nextName());

第252列是日期数据开始的地方