我以前对嵌套类使用过改造,但是我正在尝试使用的当前api具有这样的结构:
请求正文:
new Flexmonster({
container: "#pivot-container",
componentFolder: "https://cdn.flexmonster.com/",
report: {
dataSource: {
dataSourceType: "json",
data: [
{Country:'USA',description:'discription'}, // description in small
{Country:'India',description:'DISCRIPTION'}, // description in capital
{Country:'BLA',description:'dIsCrIPtiOn'}, // description mixed
]
},
options: {
grid: {
type: "flat"
},
configuratorActive: false
},
slice: {
columns: [{
uniqueName: "Country"
},
{
uniqueName: "description"
}
]
}
},
width: "100%",
height: 370
});
和类似的响应主体。
请注意bigNestedClass是一个字符串。
我为请求和响应创建了不同的pojo类。但是,创建嵌套的BigNestedClass会使此字段填充为JSON对象(如预期的那样),而不是JSON字符串。我在解析响应时也遇到了同样的问题。
我的问题:改造中是否有一种方法可以将嵌套类编码,解析为字符串?
我使用Retrofit 2.0
我使用gson(可以更改)
答案 0 :(得分:1)
使用gson,我可以简单地使用TypeAdapter
。参见下面的课程:
public class MyTypeAdapter extends TypeAdapter<BigNestedClass> {
private Gson gson = new Gson();
@Override
public BigNestedClass read(JsonReader arg0) throws IOException {
// Get the string value and do kind of nested deserializing to an instance of
// BigNestedClass
return gson.fromJson(arg0.nextString(), BigNestedClass.class);
}
@Override
public void write(JsonWriter arg0, BigNestedClass arg1) throws IOException {
// Get the instance value and insted of normal serializing make the written
// value to be a string having escaped json
arg0.value(gson.toJson(arg1));
}
}
然后,您只需向gson注册MyTypeAdapter
,例如:
private Gson gson = new GsonBuilder()
.registerTypeAdapter(BigNestedClass.class, new MyTypeAdapter())
.create();
要使用retrofit,您需要在创建它时做一些事情:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com")
.addConverterFactory(GsonConverterFactory.create(gson))
.build();