2017-02-27 58 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(); 
相關問題