当前位置: 首页 > 知识库问答 >
问题:

Gson:JsonSyntaxException:应为BEGIN_对象,但为字符串

杜砚
2023-03-14

我试图将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","start Date":"2014-05-30 11:00:00","endDate":"2014-05-30 12:00:00","位置":"位置","主题":"主题!"}

我得到的例外是

html" target="_blank">线程“main”java中出现异常。朗,反思一下。对太阳的攻击。反映NativeMethodAccessorImpl。在sun上调用0(本机方法)。反映NativeMethodAccessorImpl。在sun上调用(NativeMethodAccessorImpl.java:57)。反映DelegatingMethodAccessorImpl。在java上调用(DelegatingMethodAccessorImpl.java:43)。朗,反思一下。方法在org上调用(Method.java:606)。日食jdt。内部的jarinjarloader。装罐机。main(jarsrcloader.java:58)由:com引起。谷歌。格森。JsonSyntaxException:java。lang.IllegalStateException:应为BEGIN_对象,但在com的第1行第3列为字符串。谷歌。格森。格森。com上的fromJson(Gson.java:815)。谷歌。格森。格森。com上的fromJson(Gson.java:768)。谷歌。格森。格森。com上的fromJson(Gson.java:717)。谷歌。格森。格森。ews上的fromJson(Gson.java:689)。日历日历在ews上创建SimplePoint(Calendar.java:70)。主要的网关。主要的main(main.java:34)。。。还有5个原因:java。lang.IllegalStateException:应为BEGIN_对象,但在com的第1行第3列为字符串。谷歌。格森。流动JsonReader。com上的beginObject(JsonReader.java:374)。谷歌。格森。内部的绑定MapTypeAdapterFactory$适配器。在com上阅读(MapTypeAdapterFactory.java:183)。谷歌。格森。内部的绑定MapTypeAdapterFactory$适配器。在com上阅读(MapTypeAdapterFactory.java:145)。谷歌。格森。格森。fromJson(Gson.java:803)。。。还有10个

共有3个答案

苏晓博
2023-03-14

我在一个将被json加密的类中有一个映射,错误与上面描述的相同:

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

祁星阑
2023-03-14

我没有看到您在Gson 2.2.4中报告的异常情况,但是您应该开始使用TypeTokens作为泛型类型。

HashMap<String, String> data = gson.fromJson(json, new TypeToken<HashMap<String, String>>() {}.getType());
宁侯林
2023-03-14

您也可以将JSON字符串转换成JavaPOJO类。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解析一些非常简单的JSON。这是我的代码: 以下是从url返回的JSON: 我得到了一个例外: 有什么想法吗?我是格森的新手。

  • 当我只收到列表中的一个项目时,就会出现这个错误。我在服务器端REST Web服务中使用Jersey,只有当列表返回一个元素时,以及当它有但当它有多个异常时,它工作得非常完美,我就是这样做的: Jersey为什么不发送包含一个项目的列表?是泽西岛的虫子吗?有没有办法让它始终序列化为数组? 这是web服务返回0元素时的JSON数据: 这是web服务返回1个元素时的JSON数据: 当web服务返回超过1

  • 这个错误又回来了! 我是改装的初学者,我看过这篇文章:改装:预期BEGIN_OBJECT但BEGIN_ARRAY 但是即使我试着让它适应我的模型,我仍然不能让它工作。所以我的错误是: 我得到的是: 解析类的属性: IoTGenericDevice子类的属性: 改装电话: 经理:

  • 我的java代码 我的JSON 除id外,所有字段均为字符串 我的错误 18/11/26 18:02:55信息mapreduce。作业:任务Id:尝试_1543189350698_0010_m_000000_0,状态:失败错误:com。谷歌。格森。JsonSyntaxException:java。伊奥。EOFEException:com第1行第3列的输入结束。谷歌。格森。格森。fromJson(G

  • 我知道以前有人问过很多这个问题,但在我的情况下,我找不到解决办法。我请求获得关于POJO(电影)列表的json回复 虽然这是我第一次使用改型,但我在标题中遇到了问题。我正在创建的url是正确的,下面是响应的示例: 这是我的模特 } 我的@GET 我的数据请求类 最后,我想在我的主要活动中做些什么

  • 我对gson反序列化有问题 是我儿子 我的kotlin小工具 还有我的反序列化函数 我有这个错误 我不明白什么是错误的,我真的觉得一切都是正确的,我做了多次不同的测试。 你能帮助我吗。