java – 使用Gson解析具有不同字段的子类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 使用Gson解析具有不同字段的子类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3312字,纯文字阅读大概需要5分钟。
内容图文
![java – 使用Gson解析具有不同字段的子类](/upload/InfoBanner/zyjiaocheng/816/5f9cdbe3a40541bcbb52b185ca178799.jpg)
我正在解析具有类似于此的响应模板的数据:
{
response: {
data: {}
}
meta: {
errors: []
success: 1
}
}
对于每个特定响应,“数据”字段填充有动态字段,但所有其他键(元等)保持不变.例如:
ClassA的
data: {
foo: ""
}
ClassB的
data: {
bar: 3
}
如何建模我的类并使用Gson来表示这些数据?目前我有:
public class BaseResponse {
@SerializedName("meta") public Meta meta;
public class Meta {
@SerializedName("errors") public ArrayList<Error> errors;
@SerializedName("success") public int success;
}
}
public class ClassA extends BaseResponse {
@SerializedName("foo") public String foo;
}
public class ClassB extends BaseResponse {
@SerializedName("bar") public int bar;
}
不幸的是,foo和bar字段在解析时返回null值,例如:
Gson.fromJson(jsonString, ClassA.class);
我相信这是因为“foo”和“bar”字段是内部引用.
解决方法:
据我所知,自定义处理是提供所需多态反序列化所必需的,其中决定使用哪种类型是基于特定JSON元素名称的存在. (由于JSON不包含类型信息,因此切换到另一个序列化API(如Jackson)将无法提供更简单的解决方案.)
以下演示了我可能采取的方法.
package com.stackoverflow.q15578106;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
public class Foo
{
public static void main(String[] args)
{
/*
{
"response": {"data": {"foo": "FOO"}},
"meta": {"errors": [], "success": 1}
}
*/
String input1 = "{\"response\": {\"data\": {\"foo\": \"FOO\"}},\"meta\": {\"errors\": [], \"success\": 1}}";
/*
{
"response": {"data": {"bar": 42}},
"meta": {"errors": [], "success": 1}
}
*/
String input2 = "{\"response\": {\"data\": {\"bar\": 42}},\"meta\": {\"errors\": [], \"success\": 1}}";
processInput(input1);
// {"response":{"data":{"foo":"FOO"}},"meta":{"errors":[],"success":1}}
processInput(input2);
// {"response":{"data":{"bar":42}},"meta":{"errors":[],"success":1}}
}
static void processInput(String jsonInput)
{
DataDeserializer dataDeserializer = new DataDeserializer();
dataDeserializer.registerDataType("foo", A.class);
dataDeserializer.registerDataType("bar", B.class);
Gson gson = new GsonBuilder().registerTypeAdapter(Data.class, dataDeserializer).create();
BaseResponse response = gson.fromJson(jsonInput, BaseResponse.class);
System.out.println(new Gson().toJson(response));
}
}
class DataDeserializer implements JsonDeserializer<Data>
{
Map<String, Class<? extends Data>> dataTypeRegistry = new HashMap<String, Class<? extends Data>>();
void registerDataType(String jsonElementName, Class<? extends Data> javaType)
{
dataTypeRegistry.put(jsonElementName, javaType);
}
@Override
public Data deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
{
JsonObject jsonObject = json.getAsJsonObject();
for (String elementName : dataTypeRegistry.keySet())
{
if (jsonObject.has(elementName))
{
Class<? extends Data> dataType = dataTypeRegistry.get(elementName);
return context.deserialize(jsonObject, dataType);
}
}
throw new RuntimeException("Oops");
}
}
class BaseResponse
{
Response response;
Meta meta;
}
class Meta
{
List<String> errors;
int success;
}
class Response
{
Data data;
}
class Data
{
}
class A extends Data
{
String foo;
}
class B extends Data
{
int bar;
}
内容总结
以上是互联网集市为您收集整理的java – 使用Gson解析具有不同字段的子类全部内容,希望文章能够帮你解决java – 使用Gson解析具有不同字段的子类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。