2017-02-27 52 views
-1

我想用杰克逊映射反序列化JSON看起来像这样如何使用基于键的类型属性反序列化JSON类型?

"parameters": { 
      "bodyParameter": { 
       "type": "String" 
      }, 
      "otherParam": { 
       "type": "String" 
      }, 
      "uuid": { 
       "type": "String" 
      } 
     } 

简单POJO的一个java.util.List这样

public class Parameter { 

    String name; 

    String type; 
} 

我会为此期望类型的3个实例参数,首先将包含名称=“bodyParameter”和类型=“字符串”,依此类推。

回答

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); 

的数据地图将有键值对。迭代的entrySet和分配值到你的POJO

+0

谢谢,但仍然必须做整个自定义序列化/反序列化工作:( – Filip

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; 

的自定义序列将通过参数列表,并为每一个另一方面循环,它会首先使用参数的名称和THI创建一个字段s字段将包含一个字段的对象,即类型,使用参数的类型

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(); 
相关问题