2016-05-16 7 views
1

のn個の量繰り返しトラバースなど、反復マップの別のリストまたはオブジェクトの別のマップを含むことができ、私はマップのリストを含めることができ、一般的なマップを持って、ネストされたマップとリスト

マップmymap。

ネストされた値を更新するために地図の構造を知らなくても方法が必要です。私のマップは次のようになりますと言うたとえば:そのような「mymap.myList.myObject」などのパス式のいくつかの並べ替えに基づいて

{mymap : myList[{'myObject' : 'someValue'}, {'myObject' : 'someOtherValue'}]} 

私は新しい値ですべての」myObjectという値を交換できるようにする必要があります。

私が望む値に到達するために、すべてのマップとリストを反復的に走査できますか?これは、マップの構造が変更され、パス式に基づいて反復できるように汎用的である必要があります。

+0

地図のキーを新しいオブジェクトに置き換えたいですか?または_a_新しいオブジェクトを使用しますか? – CPerkins

+0

私は特定のキーの値を新しい値で置き換えたいと思っています。 –

+0

上記の例に基づいて、私は 'myObject'のすべての出現を新しい値に置き換えたいと思います。 –

答えて

1

JsonPathが適しています。

import java.util.*; 
import com.jayway.jsonpath.JsonPath; 

public class Sandbox { 

    private static class Widget { 
     private final String id; 

     public Widget(String id) { 
      this.id = id; 
     } 

     @Override 
     public String toString() { 
      return "Widget{id='" + id + "'}"; 
     } 
    } 

    @SuppressWarnings("unchecked") 
    public static void main(String[] args) { 
     Map map1 = new HashMap(); 
     map1.put("myObject", new Widget("cog")); 

     Map map2 = new HashMap(); 
     map2.put("myObject", new Widget("sprog")); 

     Map root = new HashMap(); 
     root.put("myList", new ArrayList(Arrays.asList(map1, map2))); 
     root.put("myObject", new Widget("frobulator")); 

     System.out.println("BEFORE: " + root); 

     // set the value of all 'myObject' nodes no matter how deeply nested 
     JsonPath.parse(root).set("$..myObject", new Widget("novaDetonator")); 

     System.out.println("AFTER:" + root); 
    } 
} 

出力:

BEFORE: {myList=[{myObject=Widget{id='cog'}}, {myObject=Widget{id='sprog'}}], myObject=Widget{id='frobulator'}} 
2016-05-16 13:44:44,337 [main] DEBUG com.jayway.jsonpath.internal.path.CompiledPath - Evaluating path: $..['myObject'] 
2016-05-16 13:44:44,343 [main] DEBUG com.jayway.jsonpath.internal.JsonContext - Set path $['myObject'] new value Widget{id='novaDetonator'} 
2016-05-16 13:44:44,344 [main] DEBUG com.jayway.jsonpath.internal.JsonContext - Set path $['myList'][0]['myObject'] new value Widget{id='novaDetonator'} 
2016-05-16 13:44:44,344 [main] DEBUG com.jayway.jsonpath.internal.JsonContext - Set path $['myList'][1]['myObject'] new value Widget{id='novaDetonator'} 
AFTER:{myList=[{myObject=Widget{id='novaDetonator'}}, {myObject=Widget{id='novaDetonator'}}], myObject=Widget{id='novaDetonator'}} 

あなたの置換値が代わりにStringかもしれもちろん、その後

com.jayway.jsonpath:json-path:2.2.0 
com.fasterxml.jackson.core:jackson-databind:2.7.0 

そして:あなたのクラスパスにこれら二つの依存関係を持っていることを確認してくださいWidget; JsonPathがどちらかと一緒に使えるのはきれいです。

関連する問題