我需要使用Gson将传入的json消息解析为Java对象。类“MessageBody”应该用于向Gson提供信息。fromJson(json,MessageBody.class);
json消息如下所示。
第一层有三个静态字段。第三个字段(“字段”)是“数据字段”对象的列表。
DataField对象有一个类型字段和一个值字段。它的价值可以是异质的。预期类型为:“字符串”、“int”、“布尔”和“HashMap”
{
"eventId": "abc",
"customerId": "abc",
"fields": {
"eventDateTime": {
"type": "datetime",
"value": "2019-05-03T10:15:30Z"
},
"eventCorrelationID": {
"type": "string",
"value": "abc"
},
"additionalAttributes": {
"type": "collection",
"value": {
"additionalAttribute1": {
"value": "abc",
"type": "string"
},
"additionalAttribute2": {
"value": "abc",
"type": "string"
}
}
}
}
}
public class MessageBody {
private String eventId;
private String customerId;
private HashMap<String, DataField> fields;
public String getEventId() {
return eventId;
}
public void setEventId(String eventId) {
this.eventId = eventId;
}
public String getCustomerId() {
return customerId;
}
public void setCustomerId(String customerId) {
this.customerId = customerId;
}
public HashMap<String, DataField> getFields() {
return fields;
}
public void setFields(HashMap<String, DataField> fields) {
this.fields = fields;
}
public class DataField {
private Object value;
private String type;
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
}
使用上面的类进行的解析适用于所有对象,除了"addtionalAt0013 tes"下的嵌套DataField列表。
它们的结果是LinkedHashTreeMap对象。不幸的是,不可能将其转换到另一个数据字段的HashMap中。
如何处理异构对象中的嵌套/递归列表?
我怎样才能让下面的陈述生效?:-)
HashMap<String, DataField> addAttrs = (HashMap<String, DataField>) messageBody.getFields().get("additionalAttributes").getValue();
您需要实现自定义JsonDeserializer
。您有类型信息,可以用来区分正确的类型。下面的实现不使用它,但是如果您有多个集合类型,您可以扩展它:
class DataFieldJsonDeserializer implements JsonDeserializer<DataField> {
private final Type collectionType = new TypeToken<Map<String, DataField>>() {}.getType();
@Override
public DataField deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
DataField dataField = new DataField();
JsonObject jsonObject = json.getAsJsonObject();
JsonPrimitive type = jsonObject.getAsJsonPrimitive("type");
dataField.setType(type.getAsString());
JsonElement value = jsonObject.get("value");
if (value.isJsonPrimitive()) {
dataField.setValue(value.getAsJsonPrimitive().getAsString());
} else {
Object result = context.deserialize(value, collectionType);
dataField.setValue(result);
}
return dataField;
}
}
寄存器适配器:
@JsonAdapter(DataFieldJsonDeserializer.class)
public static class DataField {
用法示例:
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;
import com.google.gson.JsonPrimitive;
import com.google.gson.annotations.JsonAdapter;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Gson gson = new GsonBuilder().create();
MessageBody messageBody = gson.fromJson(json, MessageBody.class);
Map<String, DataField> addAttrs = (Map<String, DataField>) messageBody.getFields()
.get("additionalAttributes").getValue();
System.out.println(addAttrs);
}
}
印刷品:
{additionalAttribute1=DataField{value=abc, type='string'}, additionalAttribute2=DataField{value=abc, type='string'}}
使用该结构,希望它有助于:
public class MessageBody {
private String eventId;
private String customerId;
private DataFields datafields;
}
public class DataFields {
private DataField eventDateTime;
private DataField eventCorrelationID;
pprivate HashMap<String, DataField> additionalAttributes;
}
public class DataField {
private Object value;
private String type;
}
问题内容: 我有一个像这样的JSON对象: 并尝试与Gson解析: 但是“ responceBean”始终为“ null” 这是所有其他类: 这是我的最新尝试。我不知何故找不到正确的方法。任何帮助将不胜感激。 问题答案: 您的 JSON模型与您的对象模型不匹配 。 您需要一个中间层来填补空白: TypeAdapter 。 而且,没有用户的命名信息。 最后是名称不匹配:JSON中的“ worklog
问题内容: 我有一个域对象Foo,我想解析一些JSON,例如 我想得到一个。像这样 问题答案: 您需要使用来正确表示类型。在这种情况下,由于与泛型类型的交互作用还不够。
问题内容: 我创建了一个简单的REST端点: 此URL返回一个非常简单的响应,其中包含 json数组 ,如下所示: 现在,我尝试 使用带有GSON的Retrofit 2 来 使用此响应 。 我添加了一个模型: 和服务: 我实例化了一个改造: 而我的服务: 现在,尝试调用数据: 最终导致异常: java.lang.IllegalStateException : 预期为BEGIN_OBJECT,但 位
我创建了一个简单的RESTendpoint: 我实例化了一个改型: 我的服务: 现在,尝试调用数据: null 但我不知道如何使改型2使用这个。 提前谢了。
问题内容: 我从REST服务返回以下JSON响应。现在,我需要将以下JSON响应反序列化为POJO。我正在与杰克逊合作。 在上面的json中,是一个可以具有多个json对象的JSON数组。现在也是JSON数组。现在棘手的部分是,我可以在每个类别对象中拥有多个级别,并且我不知道我将拥有多少个级别。给定以上JSON,我需要提取每个类别和last的内容。所以应该是这样的: 其中是类别的taskId,是l
我有一个这样的JSON文件: 如何使用Gson仅解析“数据”部分?我的想法是将JSON读入地图,然后用我在GSON中的键“数据”解析普通JSON内容。我能做些更优雅的事吗?