使用改进使用GSON获取嵌套的JSON对象

使用改进使用GSON获取嵌套的JSON对象

我正在从我的Android应用程序中使用API,并且所有JSON响应都是这样的:

{
    'status': 'OK',
    'reason': 'Everything was fine',
    'content': {
         < some data here >}

问题是,我所有的POJO有statusreason字段,里面content领域是真正的POJO我想要的。

有没有办法创建一个Gson的自定义转换器来提取总是content字段,所以改造返回适当的POJO?



呼啦一阵风
浏览 963回答 3
3回答

湖上湖

您将编写一个返回嵌入对象的自定义反序列化器。假设您的JSON是:{ &nbsp;&nbsp;&nbsp;&nbsp;"status":"OK", &nbsp;&nbsp;&nbsp;&nbsp;"reason":"some&nbsp;reason", &nbsp;&nbsp;&nbsp;&nbsp;"content"&nbsp;:&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"foo":&nbsp;123, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"bar":&nbsp;"some&nbsp;value" &nbsp;&nbsp;&nbsp;&nbsp;}}然后你有一个ContentPOJO:class&nbsp;Content{ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;foo; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;bar;}然后你写一个反序列化器:class&nbsp;MyDeserializer&nbsp;implements&nbsp;JsonDeserializer<Content>{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Content&nbsp;deserialize(JsonElement&nbsp;je,&nbsp;Type&nbsp;type,&nbsp;JsonDeserializationContext&nbsp;jdc) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;JsonParseException &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Get&nbsp;the&nbsp;"content"&nbsp;element&nbsp;from&nbsp;the&nbsp;parsed&nbsp;JSON &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JsonElement&nbsp;content&nbsp;=&nbsp;je.getAsJsonObject().get("content"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Deserialize&nbsp;it.&nbsp;You&nbsp;use&nbsp;a&nbsp;new&nbsp;instance&nbsp;of&nbsp;Gson&nbsp;to&nbsp;avoid&nbsp;infinite&nbsp;recursion &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;to&nbsp;this&nbsp;deserializer &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Gson().fromJson(content,&nbsp;Content.class); &nbsp;&nbsp;&nbsp;&nbsp;}}现在,如果您构造一个Gsonwith&nbsp;GsonBuilder并注册反序列化器:Gson&nbsp;gson&nbsp;=&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;GsonBuilder() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.registerTypeAdapter(Content.class,&nbsp;new&nbsp;MyDeserializer()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.create();您可以直接将您的JSON反序列化为Content:Content&nbsp;c&nbsp;=&nbsp;gson.fromJson(myJson,&nbsp;Content.class);编辑以添加评论:如果您有不同类型的消息但它们都具有“内容”字段,则可以通过执行以下操作使反序列化器具有通用性:class&nbsp;MyDeserializer<T>&nbsp;implements&nbsp;JsonDeserializer<T>{ &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;T&nbsp;deserialize(JsonElement&nbsp;je,&nbsp;Type&nbsp;type,&nbsp;JsonDeserializationContext&nbsp;jdc) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;JsonParseException &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Get&nbsp;the&nbsp;"content"&nbsp;element&nbsp;from&nbsp;the&nbsp;parsed&nbsp;JSON &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JsonElement&nbsp;content&nbsp;=&nbsp;je.getAsJsonObject().get("content"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Deserialize&nbsp;it.&nbsp;You&nbsp;use&nbsp;a&nbsp;new&nbsp;instance&nbsp;of&nbsp;Gson&nbsp;to&nbsp;avoid&nbsp;infinite&nbsp;recursion &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;to&nbsp;this&nbsp;deserializer &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;Gson().fromJson(content,&nbsp;type); &nbsp;&nbsp;&nbsp;&nbsp;}}您只需为每种类型注册一个实例:Gson&nbsp;gson&nbsp;=&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;GsonBuilder() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.registerTypeAdapter(Content.class,&nbsp;new&nbsp;MyDeserializer<Content>()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.registerTypeAdapter(DiffContent.class,&nbsp;new&nbsp;MyDeserializer<DiffContent>()) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.create();当你调用.fromJson()类型被带入反序列化器时,它应该适用于所有类型。最后在创建Retrofit实例时:Retrofit&nbsp;retrofit&nbsp;=&nbsp;new&nbsp;Retrofit.Builder() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.baseUrl(url) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.addConverterFactory(GsonConverterFactory.create(gson)) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.build();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java
Android