Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取java中的动态json文件并合并它们_Java_Json_Random_Merge_Dynamicobject - Fatal编程技术网

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

读取java中的动态json文件并合并它们,java,json,random,merge,dynamicobject,Java,Json,Random,Merge,Dynamicobject,我正在努力用java进行json解析。 是否有可能在java中生成随机的、非标准化的json文件的表示? 我试着使用gson,但我真的不明白这是否可能以及如何可能 因此,jsonFile可以如下所示: { "id":16875, "position":[1,2,5,7], "metadata":{ "color":"blue", "id": "84779jh", "more":{ "some":"randomdata","absolutly":"noStru

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

因此,jsonFile可以如下所示:

{ 
 "id":16875,
 "position":[1,2,5,7],
 "metadata":{
     "color":"blue",
     "id": "84779jh",
     "more":{ "some":"randomdata","absolutly":"noStructure"}
}
任何键值对都是可能的,json文件可以嵌套得尽可能深。我需要从中获得类似java对象的东西,以便能够将其与另一个json文件合并。我只需要元数据部分,其余部分可以忽略

有人知道我该怎么做吗?如果有任何帮助,我将不胜感激:)

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

将是:

  { 
   "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]
  }

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

看到您发布的json后,我认为您正在尝试合并两个具有相同id但不同元数据id的json。因为json处理键值。同一个键不能有两个值,例如此值中的值

"color":"blue", "green",
"id": "84779jh","84ergfujh"
除非将颜色作为数组。 看到ur 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();
            }

        }

注意:使用这个你需要有来自

的jar文件,我解决了我的问题,非常感谢你们帮我解决了这个问题。让我分享一下:

我把这两个JSON都看作一棵树(我使用的是Jackson):

合并逻辑尚未完成,但基本概念是:

 Iterator<String> pIt = parent.fieldNames();
    while(pIt.hasNext())
    {
        String tempkey = pIt.next();

        if(child.path(tempkey) != null)
        {
            merged.put(tempkey,child.path(tempkey));

        }
        else{
                merged.put(tempkey,parent.path(tempkey) );
        }

    }

    try {
        String jsonString = mapper.writeValueAsString(merged);
        System.out.println(jsonString);
    } catch (JsonProcessingException e) {...}
Iterator pIt=parent.fieldNames();
while(pIt.hasNext())
{
字符串tempkey=pIt.next();
if(子路径(tempkey)!=null)
{
merged.put(tempkey,child.path(tempkey));
}
否则{
merged.put(tempkey,parent.path(tempkey));
}
}
试一试{
字符串jsonString=mapper.writeValueAsString(合并);
System.out.println(jsonString);
}catch(JsonProcessingException e){…}
如果你认为这是一个愚蠢的解决方案,我愿意接受其他想法……
但我认为它可能适合我的需要


问候和感谢:)

使用Gson或Jackson,您可以将Json解组为一个
映射,该映射将表示整个结构。除此之外,我真的不确定这个问题在问什么。如果它是嵌套的,那么地图中只会有另一个地图,对吗?你能给我一个简短的代码片段吗?。谷歌是你的朋友。你说的合并到底是什么意思?如果结构真的那么随意,你应该得到一个
JsonNode
(Jackson)或
jsonement
(Gson)的结果。请注意,使用Jackson导航JSON要容易得多。我想我的示例不是最好的。英语不是我的母语,json也不是^^^但回到案例:我只想合并json文件的元数据部分,其余部分与我的搜索无关,上面的部分只是来自父jsonfile,我们需要保留它,但不需要对itI做任何事情,我假设您只想在单个json文件中存储不同的元数据。如果是这种情况,那么u可以从不同的json中提取它,并将其放在单个json中,如上所述。当json在键值对上工作时,除非它是一个数组
json3\u aftermerged={id=16875,position=[1,2,5,7],否则我们不能为single有两个值,metadata={id=84779jh,color=blue,more={some=randomdata,absolultly=noStructure},{id=16875,position=[1,2,5,7],metadata={id=84779jhdf,color=green,more={some=fasdf,absolly=afdsadsf}}}
如果其他人需要帮助,这是非常明智的
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}}}
   ObjectMapper mapper = new ObjectMapper();
   JsonNode parent = mapper.readTree(new File(path)); 
   JsonNode child= mapper.readTree(new File(path)); 
 Iterator<String> pIt = parent.fieldNames();
    while(pIt.hasNext())
    {
        String tempkey = pIt.next();

        if(child.path(tempkey) != null)
        {
            merged.put(tempkey,child.path(tempkey));

        }
        else{
                merged.put(tempkey,parent.path(tempkey) );
        }

    }

    try {
        String jsonString = mapper.writeValueAsString(merged);
        System.out.println(jsonString);
    } catch (JsonProcessingException e) {...}