使用Gson解析Json字符串给我错误

时间:2019-10-18 04:58:40

标签: android gson

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

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的方法检查返回的字符串是否包含{},它说没有,但是我的日志告诉我它包含。怎么会这样?

enter image description here

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

3 个答案:

答案 0 :(得分:1)

  

例外:com.google.gson.JsonSyntaxException:   java.lang.IllegalStateException:应为BEGIN_OBJECT,但为STRING   在第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);
}
  

答案1:

通过观察日志,看起来onMessage()方法被调用了两次,其中包含一个有效的JSON和一个无效的文本,即Message Processed in Lambda!。如果我没看错,那么只需忽略null Message对象就可以了。顺便说一下,您可以检查我的方法返回null的文本以找出问题所在,

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

    ...
}

答案 1 :(得分:0)

尝试在邮递员上运行您的api,它将在“预览”部分下显示您从服务器获得的实际响应。

答案 2 :(得分:0)

在您的Message类中替换-

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

与-

    @SerializedName("camera_id")
    @Expose
    private String cameraId;
    @SerializedName("posted_by")
    @Expose
    private String postedBy;
    @SerializedName("posted_by_user")
    @Expose
    private String postedByUser;
    @SerializedName("message")
    @Expose
    private String message;

   /**
     * No args constructor for use in serialization
     *
     */
    public Message() {
    }