2016-04-14 144 views
3

我對json相當陌生,通常不會使用多少編碼。 我想要一個服務這需要下面JSON字符串作爲輸入將json字符串剪切成java中的兩個不同的json字符串

{ 
    "var": "test11", 
    "_env": { 
     "activation": "wm6a93e3a80-0307-12cc-96e6-d79883bf841a", 
     "uuid": "48cdc2d0-0212-11e6-8315-d79883bf841a", 
     "eventID": 49167, 
     "recvTime": "Thu Apr 14 00:27:03 PDT 2016" 
    } 
} 

和吐出輸出作爲

{ 
    "var": "test11" 
} 

{ 
    "_env": { 
     "activation": "wm6a93e3a80-0307-12cc-96e6-d79883bf841a", 
     "uuid": "48cdc2d0-0212-11e6-8315-d79883bf841a", 
     "eventID": 49167, 
     "recvTime": "Thu Apr 14 00:27:03 PDT 2016" 
    } 
} 

的僅僅是一個例子。它可以在json字符串中包含更多對象,並且_env不會總是出現在最後。

有什麼簡單的方法來實現使用傑克遜API?

+0

您是否知道原始j​​son中所有密鑰的名稱以及要分離出的密鑰? – marrock

回答

3

創建一個類來保存您的JSON,如下圖所示:

public class Bar { 

    private String var; 

    @JsonProperty("_env") 
    private Object env; 

    public String getVar() { 
     return var; 
    } 

    public void setVar(String var) { 
     this.var = var; 
    } 

    public Object getEnv() { 
     return env; 
    } 

    public void setEnv(Object env) { 
     this.env = env; 
    } 
} 

,並設置反序列化映射之前未知的屬性不會失敗;

public static void main(String[] argv) throws Exception { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 

    Bar bar = mapper.readValue(JSON, Bar.class); 

} 

這樣,當_env存在或不存在時,它將工作。

如果您需要在每個節點「分裂」的JSON,你可以做這樣的事情:

JsonNode node = mapper.readTree(JSON); 
List<String> nodeJsons = new ArrayList<>(); 
Iterator<Entry<String, JsonNode>> nodeIterator = node.fields(); 
while (nodeIterator.hasNext()) { 
    Map.Entry<String, JsonNode> entry = nodeIterator.next(); 
    nodeJsons.add(mapper.writeValueAsString(entry)); 
} 

這樣,您將有JSON字符串與自身序列化每個節點列表末尾,而不是一個「大」JSON的一切。

+0

我認爲這是一個很好的答案。 –

1

與動態輸入,最好是JSON加載到地圖:

public static void main(String[] args) 
{ 
    ObjectMapper mapper = new ObjectMapper(); 
    try (Reader reader = new FileReader("C://Temp/xx.json")) { 
     // load whatever json into Map 
     @SuppressWarnings("unchecked") 
     Map<String, Object> inMap = mapper.readValue(reader, Map.class); 
     System.out.println(inMap); 
     // exmaple for generating json for each key found 
     for (String key : inMap.keySet()) { 
      mapper.writeValue(System.out, Collections.singletonMap(key, inMap.get(key))); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

無需自定義類和晦澀傑克遜配置。無論輸入什麼都會加載到Map中。您可以爲每個單獨的密鑰生成一個json,或者以任何方式對地圖內容進行interogate yyou like