Gson:JsonSyntaxException:预计BEGIN_OBJECT但是STRING

时间:2014-05-30 18:54:33

标签: java json hashmap gson

我正在尝试将JSON字符串转换为HashMap。以下是我的一些代码:

public static void createSimpleAppointment(String json){
try
    {
    Gson gson = new Gson();
    HashMap<String,String> data = new HashMap<String,String>();
    data = gson.fromJson(json, data.getClass());

在最后一行(我设置数据的地方)上抛出了异常。

JSON字符串是

  

{“body”:“body”,“startDate”:“2014-05-30 11:00:00”,“endDate”:“2014-05-30 12:00:00”,“location”: “location”,“subject”:“subject!”}

我得到的例外是

  

线程“main”java.lang.reflect.InvocationTargetException中的异常       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)       at java.lang.reflect.Method.invoke(Method.java:606)       在org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)   引起:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期BEGIN_OBJECT但在第1行第3列是STRING       在com.google.gson.Gson.fromJson(Gson.java:815)       在com.google.gson.Gson.fromJson(Gson.java:768)       在com.google.gson.Gson.fromJson(Gson.java:717)       在com.google.gson.Gson.fromJson(Gson.java:689)       在ews.calendar.Calendar.createSimpleAppointment(Calendar.java:70)       在ews.main.gateway.Main.main(Main.java:34)       ......还有5个   引起:java.lang.IllegalStateException:预期BEGIN_OBJECT但在第1行第3列是STRING       在com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374)       在com.google.gson.internal.bind.MapTypeAdapterFactory $ Adapter.read(MapTypeAdapterFactory.java:183)       在com.google.gson.internal.bind.MapTypeAdapterFactory $ Adapter.read(MapTypeAdapterFactory.java:145)       在com.google.gson.Gson.fromJson(Gson.java:803)       ......还有10个

4 个答案:

答案 0 :(得分:3)

您也可以将JSON字符串转换为Java POJO类。 POJO类中实例成员的名称应与JSON字符串中定义的完全相同(区分大小写)。

  

默认情况下,您无需将日期字符串转换为GsonBuilder#setDateFormat()方法处理的日期对象。

示例代码:

class MyJSONObject {
    private String body;
    private Date startDate;
    private Date endDate;
    private String location;
    private String subject;
    // getter & setter
}

// convert json string to MyJSONObject 
MyJSONObject data = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss")
                              .create().fromJson(jsonString, MyJSONObject.class);

// pretty printing of JSON string back from POJO class object
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(data));

输出:

{
    "body": "body",
    "startDate": "May 30, 2014 11:00:00 AM",
    "endDate": "May 30, 2014 12:00:00 PM",
    "location": "location",
    "subject": "subject!"
}

答案 1 :(得分:1)

我没有得到您使用Gson 2.2.4报告的异常,但您应该开始使用TypeToken s作为泛型类型。

HashMap<String, String> data = gson.fromJson(json, new TypeToken<HashMap<String, String>>() {}.getType());

答案 2 :(得分:0)

该错误可能会引起误解-在我的情况下,Deserializer缺少LocalDateTime,并且在第一个日期失败。

答案 3 :(得分:0)

我在要进行json处理的类中有一个Map,并且存在与上述相同的错误:

public class Setting implements Serializable {
private Map<Key, Double> keyToValue = new HashMap<>();

// other fields, setters and getters...

public Map<Key, Double> getKeyToValue() {
        return keyToValue;
    }
public void setKeyToValue(Map<PlantKey, Double> keyToValue) {
        this.keyToValue = keyToValue;
    }
}

我必须使用以下内容使其起作用:

GsonBuilder builder = new GsonBuilder();
builder.enableComplexMapKeySerialization();
builder.create();

来源:https://github.com/google/gson/issues/478