JSON解析给我JsonSyntaxException

时间:2019-05-14 07:45:34

标签: android json parsing gson illegalstateexception

我正在尝试使用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

有什么建议吗?谢谢

4 个答案:

答案 0 :(得分:1)

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

@Expose
private DataParams data;

和数据类:

public class DataParams {

    @Expose
    private String user;
    @Expose
    private String token;
    @Expose
    private String language;
}

答案 1 :(得分:0)

您的 data 字段是object,然后尝试强制转换该String,以便仅收到此错误。

您应该尝试实现这一目标,

componentWillUnmount

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

罗曼的答案是正确的,但只想说说@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)禁用一个方向