【问题标题】:In Java, how can I combine two JSON arrays of objects?在 Java 中,如何组合两个 JSON 对象数组?
【发布时间】:2011-10-29 18:04:42
【问题描述】:

我有几个字符串,每个字符串都包含一个对象数组的 JSON 表示。这是一个代码示例来说明,尽管这不是我的实际代码(传入的 JSON 字符串):

String s1 = "[{name: "Bob", car: "Ford"},{name: "Mary", car: "Fiat"}]";
String s2 = "[{name: "Mack", car: "VW"},{name: "Steve", car: "Mercedes Benz"}]";

我需要将这两个 JSON 数组组合成一个大型 JSON 数组。我可以将其视为字符串操作问题并用逗号替换内端方括号,但这并不是特别健壮(尽管我保证会得到有效的 JSON)。

我宁愿将这两个字符串视为 JSON 数组,然后以某种方式将它们加在一起。这是一个很棒的计划,只是我不知道“不知何故”部分。

有谁知道不需要构建 JSON 对象的 Java 对象表示的 Java 解决方案?

谢谢!

【问题讨论】:

  • 我的建议是为此使用一些 JSON 库,但是“不需要构建 JSON 对象的 Java 对象表示的 Java 解决方案”呢?意味着您出于某种原因不想使用单独的库?
  • 不,外部库很好 - 我确信它们是必要的。我的意思是我不想为 JSON 数组中的每个对象创建一个 Java 对象,即我不想为每个对象创建 MyObject myobj = new MyObject(name, car);,然后合并 MyObjects 的数组并将合并后的数组转换回 JSON .我想找到一种方法将所有内容都保留在 JSON 中。

标签: java json


【解决方案1】:

这是我的解决方案,您可能想要合并两个以上的数组:

public static JSONArray mergeMultiJsonArray(JSONArray... arrays) {
    JSONArray outArray = new JSONArray();
    for (JSONArray array : arrays)
        for (int i = 0; i < array.length(); i++)
            outArray.put(array.optJSONObject(i));
    return outArray;
}

【讨论】:

    【解决方案2】:

    此代码将采用sourceArray (s2),并将其附加到destinationArray (s1) 的末尾:

    String s1 = "[{name: \"Bob\", car: \"Ford\"},{name: \"Mary\", car: \"Fiat\"}]";
    String s2 = "[{name: \"Mack\", car: \"VW\"},{name: \"Steve\", car: \"Mercedes Benz\"}]";
    
    JSONArray sourceArray = new JSONArray(s2);
    JSONArray destinationArray = new JSONArray(s1);
    
    for (int i = 0; i < sourceArray.length(); i++) {
        destinationArray.put(sourceArray.getJSONObject(i));
    }
    
    String s3 = destinationArray.toString();
    

    【讨论】:

      【解决方案3】:

      您实际上只有两个选择:解析 JSON(这总是涉及构造对象)或不解析 JSON。当然,不解析会更便宜。

      乍一看,您将其视为字符串操作问题的想法可能听起来很脆弱,但我想得越多,它似乎就越有道理。对于错误检测,您可以通过检查方括号轻松确认您确实在处理数组;之后,只需去掉结尾括号,添加逗号,去掉开头括号,然后添加“尾巴”就可以完美地工作。我能想到的唯一例外是,如果任一数组为空,则应将另一个字符串原样返回;同样,这很容易作为字符串进行检查。

      我真的不认为有任何理由让它比这更复杂。

      【讨论】:

      • 因为我保证能取回一个长度 > 0 的有效 JSON 数组,所以按照你的建议做是最有意义的。谢谢!
      • 我认为这种黑客行为很危险,不应该这样做。稍后可能会改进 api 以提供更好的方法来执行此操作,但脆弱且出乎意料的 hack 会浪费比处理器时间更多的工时。
      • 您当然有权发表自己的意见,但除了诉诸一般原则之外,我很想听听任何具体的反对意见。考虑到 JSON 的语法和这个问题的参数,上面提到的错误检查足以使它变得非常健壮。即使是中等大小的数组,将其视为一个 sting 操作问题的效率也会提高许多数量级,而且我可以想到多种情况下这种解决方案会更可取。
      • @Sojunn 危险怎么办?我使用了这种方法,它对我有用,我确实确保检查 null 和空 json 数组。
      【解决方案4】:

      这个函数很神奇,添加多个数组,返回一个包含所有元素的 JSONArray

      public static JSONArray JoinArrays(JSONArray... jsonArrays) {
          JSONArray resultJSONArray = new JSONArray();
          Arrays.stream(jsonArrays).forEach(jsonArray -> IntStream.range(0, jsonArray.length()).mapToObj(jsonArray::get).forEach(resultJSONArray::put));
          return resultJSONArray;
      }
      

      【讨论】:

        【解决方案5】:

        我使用此代码将 jsonArray 的所有元素附加到公共 JsonArray。

        public JSONArray getMergeJsonArrays(ArrayList<JSONArray> jsonArrays) throws JSONException
        {
            JSONArray MergedJsonArrays= new JSONArray();
             for(JSONArray tmpArray:jsonArrays)
             {
                for(int i=0;i<tmpArray.length();i++)
                {
                    MergedJsonArrays.put(tmpArray.get(i));
                }
             }
            return MergedJsonArrays;
        }
        

        【讨论】:

          【解决方案6】:

          我将此代码用于合并两个 Json 数组。

          String s1 = "[{name: \"Bob\", car: \"Ford\"},{name: \"Mary\", car: \"Fiat\"}]";
          String s2 = "[{name: \"Mack\", car: \"VW\"},{name: \"Steve\", car: \"Mercedes Benz\"}]";
          String s3=new String("");
          s1=s1.substring(s1.indexOf("[")+1, s1.lastIndexOf("]"));
          s2=s2.substring(s2.indexOf("[")+1, s2.lastIndexOf("]"));
          s3="["+s1+","+s2+"]";
          System.out.println(s3);
          

          【讨论】:

          • 如果您的 JSON 包含方括号而不是用于声明数组的方括号,则上面的代码将中断。使用lastIndexOf 而不是indexOf 来防止这种情况发生。
          【解决方案7】:

          使用Below Method传递ArrayList中的所有JSON数组此方法将返回累积的JsonArray

          public JSONArray getMergeJson(ArrayList<JSONArray> xyz){
              JSONArray result=null;
              JSONObject obj= new JSONObject();
              obj.put("key",result);
              for(JSONArray tmp:patches){
                  for(int i=0;i<tmp.length();i++){
                   obj.append("key", tmp.getJSONObject(i));   ;
                  }
          
                      }
              return obj.getJSONArray("key");
          }
          

          【讨论】:

          • 这里的“补丁”是什么,在 for 循环中?
          • 我认为应该是 xyz。感谢您的修复。这段代码运行起来很轻松。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-10
          • 2016-11-12
          • 1970-01-01
          • 2016-03-22
          相关资源
          最近更新 更多