2016-04-14 11 views
3

私はjsonにはかなり新しく、通常はdonotを使用して多くのコーディングを行います。 私は入力jsonの文字列をJavaの2つの異なる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" 
    } 
} 

として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" 
    } 
} 

ザ・は単なる一例であるとして、出力を吐き出します。それはjsonの文字列の中にもっと多くのオブジェクトを含むことができ、_envはいつも最後に現れるわけではありません。

ジャクソンAPIを使用して簡単に達成する方法はありますか?

+0

元のjsonのすべてのキーの名前と、分離したいキーを知っていますか? – 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文字列のリストを持っています。この方法1つの "大きな" 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を生成するか、マップの内容をyyouのように任意の方法で相互に変換することができます