首页 > 解决方案 > 使用 Gson 解析 Json 字符串给了我错误

问题描述

我无法为我的生活弄清楚我为什么会得到

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:
Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

我可能已经阅读了超过 15 个 stackoverflow 页面,并尝试了一整天的解决方案。

我有一个简单的 websocket 侦听器,每次从我的 websocket 服务器发送消息时都会返回一个字符串。

@Override public void onMessage(WebSocket webSocket, String text) {

    Log.d(TAG, "onMessage: Recieved: " + text);

}

它返回字符串:

{ 
   "camera_id":"e9502c54-927c-4639-a94f-8d03149c9c62",
   "posted_by":"14b07da5-1820-40db-8508 cc81261458aa",
   "posted_by_user":"david23",
   "message":"hello world"
}

我使用我的模型类成功地获取了每个项目

public class Message {

    private String camera_id;
    private String posted_by;
    private String posted_by_user;
    private String message;

    public String getMessage() {
        return message;
    }

    ... rest of methods
}

在我的 onMessage 监听器中......

try{
    Gson gson = new Gson();
    Message message = gson.fromJson(text, Message.class);
    Log.d(TAG, "onMessage: " + message.getMessage());
}catch (Exception e){
    Log.d(TAG, "onMessage: Error: " + e);
}

我成功地提取了消息密钥的字符串,但是 gson 不断向我抛出这个错误,我无法弄清楚为什么。

Exception: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 
Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

一些解决方案告诉我确认从服务器发送的 json 是一个字符串。我有双重,三重,无数次检查它是一个字符串。甚至确保使用.. String.valueOf(text)

有人可以帮我查明错误的原因吗?

编辑 1:________________________________________________

使用 Roaim 的方法检查我返回的字符串是否包含 {},它说它不包含,但我的日志告诉我它包含。怎么会这样?

在此处输入图像描述

onMessage: Recieved: {"camera_id":"e9502c54-927c-4639-a94f-8d03149c9c62","posted_by":"14b07da5-1820-40db-8508-cc81261458aa","posted_by_user":"david23","message":"hello world"}

onMessage: hello world

Error: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String evan.com.websocketchatapplication.Message.getMessage()' on a null object reference

标签: androidgson

解决方案


异常:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期 BEGIN_OBJECT 但在第 1 行第 1 列路径 $

上述异常表明 GSON 期望字符串以开头,{但它得到了其他内容。

如果你能确保字符串以 开头{,那么上面的异常就会消失。让我告诉你如何确保,

public Message jsonToMessage(String json) {
    if (!json.contains("{") || !json.contains("}")) return null;

    String text = json.substring(json.indexOf("{"));
    JsonReader reader = new JsonReader(new StringReader(text));
    reader.setLenient(true);

    Gson gson = new Gson();
    return gson.fromJson(reader, Message.class);
}

对Edit1的回答:

从观察日志来看,该方法似乎onMessage()被调用了两次,其中一个有效 JSON 和一个无效文本,即Message Processed in Lambda!. 如果我没有错,那么简单地忽略空Message对象就可以了。顺便说一句,您可以检查我的方法返回 null 的文本以找出问题所在,

public Message jsonToMessage(String json) {
    if (!json.contains("{") || !json.contains("}")) {
        Log.d(TAG, "onMessage: jsonToMessage: " + json);
        return null;
    }

    ...
}

推荐阅读