我正在使用Android应用程序中的API,所有JSON响应均如下所示:
{
'status': 'OK',
'reason': 'Everything was fine',
'content': {
< some data here >
}
问题是,我所有的POJO有status
,reason
字段,里面content
领域是真正的POJO我想要的。
有什么方法可以创建Gson的自定义转换器以始终提取content
字段,因此改造会返回适当的POJO?
您将编写一个自定义反序列化器,该反序列化器返回嵌入的对象。
假设您的JSON是:
{
"status":"OK",
"reason":"some reason",
"content" :
{
"foo": 123,
"bar": "some value"
}
}
然后,您将获得一个Content
POJO:
class Content
{
public int foo;
public String bar;
}
然后编写一个反序列化器:
class MyDeserializer implements JsonDeserializer<Content>
{
@Override
public Content deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
throws JsonParseException
{
// Get the "content" element from the parsed JSON
JsonElement content = je.getAsJsonObject().get("content");
// Deserialize it. You use a new instance of Gson to avoid infinite recursion
// to this deserializer
return new Gson().fromJson(content, Content.class);
}
}
现在,如果您构造一个Gson
with GsonBuilder
并注册反序列化器:
Gson gson =
new GsonBuilder()
.registerTypeAdapter(Content.class, new MyDeserializer())
.create();
您可以直接将JSON反序列化为Content
:
Content c = gson.fromJson(myJson, Content.class);
编辑以添加评论:
如果您有不同类型的消息,但是它们都具有“ content”字段,则可以通过执行以下操作使反序列化器通用:
class MyDeserializer<T> implements JsonDeserializer<T>
{
@Override
public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
throws JsonParseException
{
// Get the "content" element from the parsed JSON
JsonElement content = je.getAsJsonObject().get("content");
// Deserialize it. You use a new instance of Gson to avoid infinite recursion
// to this deserializer
return new Gson().fromJson(content, type);
}
}
您只需为每种类型注册一个实例:
Gson gson =
new GsonBuilder()
.registerTypeAdapter(Content.class, new MyDeserializer<Content>())
.registerTypeAdapter(DiffContent.class, new MyDeserializer<DiffContent>())
.create();
当您调用.fromJson()
该类型时,该类型将携带到反序列化器中,因此它应适用于所有类型。
最后,在创建Retrofit实例时:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
问题内容: 我正在使用Android应用程序中的API,所有JSON响应均如下所示: 问题是,我所有的POJO有,字段,里面领域是真正的POJO我想要的。 有什么方法可以创建Gson的自定义转换器来提取始终的字段,因此改造会返回适当的POJO? 问题答案: 你将编写一个自定义反序列化器,以返回嵌入式对象。 假设你的JSON是: 然后,你将获得一个ContentPOJO: 然后编写一个反序列化器:
有什么方法可以创建一个Gson的自定义转换器来提取字段,从而使regetfit返回appipiate POJO吗?
我想从API中获取countynames,它返回嵌套对象; 等等,有200多个国家,每个县都有自己的“编号”。最后,我想列出所有“姓名”信息。我想我应该使用JsonDeserializer,但不幸的是我不能。
问题内容: 我正在尝试从上述JSON检索邮政编码。我正在用gson解析它。我是JSON的新手,从我在这里的所有文章中读到的内容(有些与此类似),我都知道字段名称应保持原样。所以我知道我必须做出4类,即响应,视图,结果和地址。我使它们成为静态嵌套类,但是我只得到空值作为输出。在下一个JSON中,我有多个地址。但是我只停留在这个单一的回应上。 举一个简短的例子,我尝试使用此代码检索Timestamp,
我想做的是使用Gson将嵌套的json数据解析为Java对象,并使用自定义的toString()将其打印出来。 Json内容 POJO类:示例 POJO类:JsonFormatter 我的POJO还有其他类,我试图将其解析为Gson的方式是: 但是当我试图打印出它的子值时,比如 我得到了错误: 我想实现的是将上面的json内容打印成这样: 谁能帮我解决这个问题吗?提前谢谢!
问题内容: 我正在使用json对象返回一个结果数组,并且试图使用我的customObjectResponse类拉出每个对象中的每个字段…这是一个对象的问题,所以我该如何编辑我的类为了允许它接受一个对象数组,然后能够调用每个对象的字段…我对需要添加的内容感到困惑: 这是正在使用的响应示例: 这是我的响应对象类: 我正在尝试但不起作用的内容,即使我将这些类分为各自的文件也是如此: 问题答案: 我最终只