【问题标题】:read dynamic json files in java and merge them在java中读取动态json文件并合并它们
【发布时间】:2014-03-17 16:40:51
【问题描述】:

我正在为 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":"green",
     "id": "84ergfujh",
     "more":{ 
        "some":"randomdata",
        "even":"more",
        "absolutly":"noStructure"
     },
     "tags":[1,2,3,4,6,8,f7,h,j,f]
   }

应该是:

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

提前致谢,祝您有美好的一天。

【问题讨论】:

  • 使用 Gson 或 Jackson,您可以将您的 Json 解组为代表整个结构的 Map<String, Object>。我不太确定这个问题在问什么。
  • 如果它是嵌套的,那么地图中只会有另一张地图,对吧?能给个短代码sn-p吗?
  • Here's the first result on Google。 Google 是您的朋友。
  • 完全合并是什么意思?
  • 如果结构真的那么随意,您应该得到JsonNode (Jackson) 或JsonElement (Gson) 的结果。请注意,虽然使用 Jackson 导航 JSON 要容易得多

标签: java json random merge dynamicobject


【解决方案1】:

在看到您发布的 json 后,我认为您正在尝试合并两个具有相同 ID 但元数据 ID 不同的 json。由于 json 对键值起作用。同一个键不能有两个值,例如这个值

"color":"blue", "green",
"id": "84779jh","84ergfujh"

除非你把颜色当作一个数组。 看到你的 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();
            }

        }

输出:

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}}}

注意使用这个你需要有来自http://code.google.com/p/guava-libraries/的jar文件

【讨论】:

  • 我猜我的例子不是最好的。英语不是我的母语,json 也不是 ^^ 但回到案例:我只想合并 Json 文件的 metaData 部分,其余的对我的搜索无关紧要,上面的部分只是来自父 jsonfile,我们需要保留它,但不要对它做任何事情
  • 我假设您只想在单个 json 文件中存储不同的元数据。如果是这种情况,您可以从不同的 json 中提取它并将其放在单个 json 中,如上所述。由于 json 在键值对上工作,我们不能有两个单独的值,除非它是一个数组 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}}}
【解决方案2】:

我的问题解决了,我很感激你们帮助我解决了这个问题。所以让我分享一下:

我将这 2 个 json 都作为一棵树来阅读(我正在使用 Jackson):

   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) {...}

如果您认为这是一个愚蠢的解决方案,我愿意接受其他想法...
但我认为它可能适合我的需求。

问候和感谢 :)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 2013-07-17
相关资源
最近更新 更多