【问题标题】:JSON parsing gives me JsonSyntaxExceptionJSON解析给了我JsonSyntaxException
【发布时间】:2019-10-01 04:20:27
【问题描述】:

我正在尝试使用 Gson 将带有 JSON 的响应字符串转换为对象,但我遇到了一个异常,我认为这是由双引号或其他原因引起的。

要转换的结果如下:

    {
  "params": {
    "data": {
      "user": "USER01",
      "token": "924e24fdd200760b3bb",
      "language": "es-ES"
    },
    "path": "funds",
    "method": "POST",
    "okCallback": "SUCESS",
    "koCallback": "ERROR"
  }
}

我有一个自定义对象来解析这个响应。

public class HybridParams {

    @SerializedName("method")
    @Expose
    private String method;
    @SerializedName("path")
    @Expose
    private String path;
    @SerializedName("data")
    @Expose
    private String data;
    @SerializedName("okCallback")
    @Expose
    private String okCallback;
    @SerializedName("koCallback")
    @Expose
    private String koCallback;

我正在尝试做:

new Gson().fromJson(requestJson, HybridRequest.class);

但我得到了错误:

Caused by: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 20 path $.params.data

有什么建议吗??谢谢

【问题讨论】:

    标签: android json parsing gson illegalstateexception


    【解决方案1】:

    您正在尝试将 JSON 中的数据对象反序列化为字符串对象。为 Data 对象定义一个类并更改 HybridParams 中的数据类型。

    @Expose
    private DataParams data;
    

    还有数据类:

    public class DataParams {
    
        @Expose
        private String user;
        @Expose
        private String token;
        @Expose
        private String language;
    }
    

    【讨论】:

    • 谢谢,但是这个“数据”可能会改变参数。 :(
    • 如果你的数据对象每次都没有相同的属性,也许你可以把它改成JsonObject(那时不需要DataParams类),然后根据它包含的字段反序列化成其他一些类稍后。
    【解决方案2】:

    您的 data 字段是对象,您尝试强制转换该字符串,因此只有您收到此错误。

    你应该努力做到这一点,

    @SerializedName("data")
        @Expose
        private YourNewObject data;
    

    您可以从 YourNewObject 解析用户、令牌和语言

    【讨论】:

      【解决方案3】:

      数据是一个 JSON 对象。但是您在 String 数据类型下解析它。 因此,错误:应为字符串,但为 BEGIN_OBJECT;这意味着编译器期待一个 String (由 YOU 定义),但它是一个 BEGIN_OBJECT (如数据中所示)。 您的解决方案是更改定义或数据,以使它们都匹配。 祝你好运。

      【讨论】:

        【解决方案4】:

        Romain 的回答是正确的,但只想说一下@SerializedName 和@Expose。

        在您的情况下,您不必同时使用这两个注释。

        @SerializedName("method")
        @Expose
        private String method;
        

        等同于:

        @Expose
        private String method;
        

        所以,@Expose 包含在 @SerializedName 中,两者都不需要。

        如果您在这种情况下对 API 属性“方法”感到满意,则无需添加 @SerializedName。

        如果 API 属性的名称与您的 Class 属性不同,则使用 @SerilizedName(并且您可以避免使用 @Expose)。

        @Expose 还有一个角色。 JSON解析器工作在两个方向,序列化和反序列化,您可以使用@Expose(serialize=false) 或@Expose(deserialize=false) 禁用一个方向

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-07
          • 2018-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多