我想使用Jackson Mapper反序列化一个看起来像这样的JSON
"parameters": {
"bodyParameter": {
"type": "String"
},
"otherParam": {
"type": "String"
},
"uuid": {
"type": "String"
}
}
到像这样的简单POJO的java.util.List
public class Parameter {
String name;
String type;
}
我希望有3个类型为Parameter的实例,首先包含name =“bodyParameter”和type =“String”,依此类推。
答案 0 :(得分:1)
你可以使用jacksonJson库。
Maven:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.5</version>
</dependency>
伪码:
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> dataMap = mapper.readValue(json, Map.class);
dataMap将具有键值对。迭代entrySet并将值分配给POJO
答案 1 :(得分:0)
为了让这个工作在序列化/反序列化方面我必须得到杰克逊的定制支持
@JsonDeserialize(using = ParametersDeserializer.class)
@JsonSerialize(using = ParametersSerializer.class)
private List<Parameter> parameter;
自定义反序列化器基本上会循环JSON“参数”节点字段并返回参数列表
JsonNode node = jsonParser.readValueAsTree();
List<Parameter> items = new ArrayList<>();
Iterator<String> it = node.fieldNames();
while(it.hasNext()) {
String nextField = it.next();
JsonNode n = node.get(nextField);
JsonNode type = n.get("type");
Parameter p = new Parameter();
p.setName(nextField);
p.setType(type.asText());
items.add(p);
}
return items;
另一方面,自定义序列化程序将循环遍历参数列表,对于每个参数,它将首先使用参数的名称创建一个字段,该字段将包含一个具有一个字段的对象,即类型,使用参数的类型
jsonGenerator.writeStartObject();//com.fasterxml.jackson.core.JsonGenerator
for (Parameter p : parameters) {
jsonGenerator.writeFieldName(p.getName());
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("type", p.getType());
jsonGenerator.writeEndObject();
}
jsonGenerator.writeEndObject();