![](/img/trans.png)
[英]Google Gson - com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT
[英]Gson: JsonSyntaxException: Expected BEGIN_OBJECT but was STRING
我正在尝试将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” ,“主题”:“主题!”}
我得到的例外是
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl)的sun.reflect.NativeMethodAccessorImpl.invoke0(本地方法)中的线程“main”java.lang.reflect.InvocationTargetException中的异常.java:43)atg.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)中的java.lang.reflect.Method.invoke(Method.java:606)引起:com.google。 gson.JsonSyntaxException:java.lang.IllegalStateException:预期BEGIN_OBJECT但是在com.google.gson.Gson.fromJson(Gson.java:815)的com.google.gson.Gson.fromJson(Gson。)的第1行第3列是STRING。 java:768)com.google.gson.Gson.fromJson(Gson.java:717)at com.google.gson.Gson.fromJson(Gson.java:689)at 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.g o.com.gson.stream.JsonReader.beginObject(JsonReader.java:374)位于com.google.gson.internal.bind的com.google.gson.internal.bind.MapTypeAdapterFactory $ Adapter.read(MapTypeAdapterFactory.java:183)。来自com.google.gson.Gson.fromJson的MapTypeAdapterFactory $ Adapter.read(MapTypeAdapterFactory.java:145)(Gson.java:803)... 10更多
您也可以将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!"
}
我没有得到你用Gson 2.2.4报告的异常,但是你应该开始使用TypeToken
用于泛型类型。
HashMap<String, String> data = gson.fromJson(json, new TypeToken<HashMap<String, String>>() {}.getType());
该错误可能有点误导 - 在我的情况下,它是LocalDateTime
缺少的Deserializer
,并且在第一个日期失败。
我在一个类中有一个要被json-ed的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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.