如何使用基于键的类型属性反序列化JSON类型?

时间:2017-02-27 21:01:52

标签: java json

我想使用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”,依此类推。

2 个答案:

答案 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();