我正在尝试使用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
有什么建议吗?谢谢
答案 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)禁用一个方向