在java中读取动态json文件并合并它们

mal*_*lle 3 java random merge json dynamicobject

我正在努力与java中的json解析.
是否有可能在java中生成随机的,非标准化的json文件的表示?我试图使用gson,但我真的不明白是否以及如何可能.

所以jsonFile看起来像这样:

{ 
 "id":16875,
 "position":[1,2,5,7],
 "metadata":{
     "color":"blue",
     "id": "84779jh",
     "more":{ "some":"randomdata","absolutly":"noStructure"}
}
Run Code Online (Sandbox Code Playgroud)

任何键值对都是可能的,json文件可以嵌入尽可能多的深度.我需要得到类似java对象的东西才能将它与另一个json文件合并.我只需要元数据部分,其余部分可以忽略.

所以任何人都有任何想法,我怎么能做到这一点?我会很感激任何帮助:)

上面的json合并(这是父节点,所以我们保留他的id和位置,只是合并元数据)

  { 
   "id":16zut,
   "position":[1,2,5,7],
   "metadata":{
     "color":"green",
     "id": "84ergfujh",
     "more":{ 
        "some":"randomdata",
        "even":"more",
        "absolutly":"noStructure"
     },
     "tags":[1,2,3,4,6,8,f7,h,j,f]
   }
Run Code Online (Sandbox Code Playgroud)

将会:

  { 
   "id":16zut,
   "position":[1,2,5,7],
    "metadata":{
    "color":["blue", "green"],
    "id": ["84779jh","84ergfujh]",
    "more":{ "some":"randomdata","absolutly":"noStructure","even":"more"}
    "tags":[1,2,3,4,6,8,f7,h,j,f]
  }
Run Code Online (Sandbox Code Playgroud)

提前谢谢,祝你有个愉快的一天.

ram*_*027 5

在看到你发布的json后我认为你正在尝试合并两个具有相同id但不同元数据id的json.由于json工作的关键值.您不能为同一个键设置两个值,例如此值

"color":"blue", "green",
"id": "84779jh","84ergfujh"
Run Code Online (Sandbox Code Playgroud)

除非你把颜色作为一个数组.在看到你的json后,你可以根据元数据id创建地图,你可以将这些元数据地图添加到单个元数据地图中

        import java.io.File;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Map;
    import org.codehaus.jackson.map.ObjectMapper;
    import org.codehaus.jackson.type.TypeReference;
    import com.google.common.collect.ImmutableMap;
    public class JsonFileMapExample {
        public static void main(String[] args) {
            try {
                ObjectMapper mapper = new ObjectMapper();
                // read JSON from a file
                Map<String, Object> map_json1 = mapper.readValue(new File(
                        "F:/Work/DB/work/workspace/restclient/src/json1.json"),
                        new TypeReference<Map<String, Object>>() {
                        });
                Map<String, Object> map_json2 = mapper.readValue(new File("F:/Work/DB/work/workspace/restclient/src/json2.json"),new TypeReference<Map<String, Object>>() { });
                System.out.println(map_json1);
                System.out.println(map_json2);
                Map<String, Object> map2 = (Map<String, Object>) map_json1.get("metadata");         
                Map<String, Object> map_json3 = new HashMap<String, Object>();          
                map_json3 = mergeMyTwoMaps((Map<String, Object>) map_json1.get("metadata"),(Map<String, Object>) map_json2.get("metadata"));            
                System.out.println(map_json3);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        static Map<String, Object> mergeMyTwoMaps(Map<String, Object> map1, Map<String, Object> map2) {
              return ImmutableMap.<String, Object>builder()
                  .putAll(map1)
                  .putAll(map2)
                  .build();
            }

        }
Run Code Online (Sandbox Code Playgroud)

输出:

json1=  {id=16875, position=[1, 2, 5, 7], metadata={id=84779jh, color=blue, more={some=randomdata, absolutly=noStructure}}} 
json2={id=16875, position=[1, 2, 5, 7], metadata={id=84779jhdf, color=green, more={some=dsfasdf, absolutly=afdsadsf}}}
json3_aftermerged={id=16875, position=[1, 2, 5, 7], metadata={id=84779jh, color=blue, more={some=randomdata, absolutly=noStructure}},{id=16875, position=[1, 2, 5, 7], metadata={id=84779jhdf, color=green, more={some=dsfasdf, absolutly=afdsadsf}}}
Run Code Online (Sandbox Code Playgroud)

使用此注意事项您需要http://code.google.com/p/guava-libraries/上的 jar文件