假设我有一组a、B、C类:
公开A类:整数;
公共B类:整数;字符串地址;
公共类C:int orderNumber;
如何反序列化仅包含这些类但顺序未知的Json字符串(在Java中使用Gson)?例如:
{//A
"number" : 3
}
//C
{
"orderNumber": 10
}
//B
{
"number" : 5
"address" : "New York"
}
//C
{
"orderNumber": 1
}
非常感谢你!
如果您有更复杂的类和更多的字段,这不是一个通用的策略,或者无论如何是一个很好的策略。
但是,如果要反序列化的类与示例中提供的类一样简单,那么创建一个包含所有这些字段的类
@Getter
public class Z {
private Integer orderNumber;
private Integer number;
private String address;
}
您将获得一个Z
s列表,根据字段中的null
或非null
您可以(如果需要)稍后从Z
构建a
、B
或C
。
如果要反序列化的类更复杂,您无论如何都需要创建某种机制来确定要解析和返回的类是什么。这可能就像用户1516873在评论中建议的那样
Collection<Map<String,String>>
因此,对于每个项目,您需要通过该映射中存在哪些字段来确定将构建哪些类-A
,B
或C
——项目。
pirho的答案是干净和简单的,如果像他说的,你们的课程像你们提供的那个样简单。但如果不是这样,您可以编写自己的反序列化程序。
public class PayloadJsonDeserializer implements JsonDeserializer {
@Override
public Object deserialize(JsonElement elm, Type type, JsonDeserializationContext context) throws JsonParseException {
// create java objects based on the properties in the json object
JsonPrimitive orderNumber = elm.getAsJsonObject().getAsJsonPrimitive("orderNumber");
if(!orderNumber.isJsonNull()) {
return new C(orderNumber.getAsInt());
}
return null;
}
}
向Gson注册您的自定义反序列化程序。
GsonBuilder gsonBuilder = new GsonBuilder()
.registerTypeAdapter(PayloadJson.class, new PayloadJsonDeserializer());
Gson gson = gsonBuilder.create();
使用它来反序列化json。
gson.fromJson(jsonString, PayloadJson[].class);
问题内容: 我想通过Google Gson传输列表对象,但是我不知道如何反序列化泛型类型。 看了这个之后我尝试了什么(BalusC的答案): 但是后来我在日食中遇到了一个错误,说“新的List(){}类型必须实现继承的抽象方法…”,如果我使用快速修复方法,则会得到20个以上的方法存根的怪物。 我很确定有一个更简单的解决方案,但是我似乎找不到它! 编辑: 我现在有 但是,我确实在“ fromJson
问题内容: 由于要执行处理的业务逻辑,因此我正在实现自定义。但是某些部分可以解析为标准方式。这是否可能- 我自己处理一些元素,并让一些嵌套元素自动处理? 这是JSON: 这是项的自定义反序列化器: 现在,我想让GSON解析枚举。我可以自己完成,这只是几行代码,但是我更愿意库做很多。 问题答案: …但是我希望图书馆尽其所能。 好吧,只需使用Gson。 有数据传输对象模式,尤其是Gson映射类,可以完
json如下所示: 我读了20多个答案,但找不到如何反序列化这样一个结构,请帮助我了解这个课程是什么样的,因为小时不是一个固定的字符串。
我有一门课是这样的: 但是当我试图序列化它时,我收到一个错误,上面写着“试图序列化java.lang.class:java.lang.字符串。忘记注册一个类型适配器了吗?”。所以我创建了这个适配器: } 并登记如下: 但我还是犯了同样的错误<我做错了什么 适配器的实现看起来正常吗?
问题内容: 我如何使用gson 2.2.4序列化和反序列化一个简单的枚举? 问题答案: 根据 GsonAPI文档 ,Gson提供了的默认序列化/反序列化,因此基本上,应使用标准和方法(与其他类型一样)对序列化和反序列化。
问题内容: 我使用了很多不可变的集合,并且很好奇如何使用Gson反序列化它们。由于没有人回答,而且我自己找到了解决方案,因此我正在简化问题并提出自己的答案。 我有两个问题: 如何为所有人编写一个作品? 如何全部注册? 问题答案: 更新:有https://github.com/acebaggins/gson- serializers ,其中涵盖了许多番石榴集合: 如何编写适用于所有Immutable