Android 使用Gson解析Json字符串时出错

Android 使用Gson解析Json字符串时出错,android,gson,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服务器发送消息时都返回一个字符串 @Overrid

我一辈子都搞不懂为什么我会

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.valueOftext

有人能帮我找出错误的原因吗

编辑1:________________________________________________

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


尝试在postman上运行api,它将在预览部分显示您从服务器获得的实际响应

在消息类中替换-

    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() {
    }
例外:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException:应为BEGIN_对象,但为字符串 在第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,另一个是无效的文本,即在Lambda中处理的消息!。如果我没有错,那么简单地忽略null Message对象就可以了。顺便说一下,您可以检查我的方法返回null的文本以找出问题所在

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

    ...
}

post what Log.dTAG,onMessage:received:+text;prints。它打印我上面列出的字符串,包括{}??是的,包括{}。我一回到家就测试它。我尝试了,不幸的是它不起作用。但是我返回的字符串说它不包括{},即使我的日志说它需要手动解析它-尝试{JSONObject obj=new JSONObjecttext;}catchJSONException e{//记录异常并查看它的内容}@davids。它返回null意味着它不包含{}。但是我的日志告诉我包含它。请检查上面的编辑。最后,您确定了问题。我的websocket返回了两条消息,第一条消息已成功处理,但第二条消息是由回调函数发送的,无法处理,导致了错误。感谢您的帮助,我花了一整天的时间尝试犯错误!!!不,邮递员只使用HTTP方法,但你可以使用邮递员的chrome应用程序
public Message jsonToMessage(String json) {
    if (!json.contains("{") || !json.contains("}")) {
        Log.d(TAG, "onMessage: jsonToMessage: " + json);
        return null;
    }

    ...
}