В Java, как я могу объединить два массива JSON объектов?
У меня есть несколько строк, каждая из которых содержит представление 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. Я мог бы рассматривать это как проблему манипуляции с String и заменять внутренние квадратные скобки запятыми, но это не особенно надежное (хотя я гарантированно получил бы действительный JSON).
Я предпочел бы рассматривать эти две строки как массивы JSON и как-то добавлять их вместе. Это отличный план, за исключением того, что я не знаю части "как-то".
Кто-нибудь знает решение на Java, которое не требует создания объектов Java Object объектов JSON?
Спасибо!
Ответы
Ответ 1
У вас действительно есть только два варианта: проанализируйте JSON (который обязательно будет включать в себя создание объектов) или не разобрать JSON. Разумеется, разбор не будет дешевле.
На первый взгляд ваша идея о том, чтобы рассматривать его как проблему с манипулированием строкой, может показаться хрупкой, но чем больше я думаю об этом, тем больше кажется, что это имеет смысл. Для обнаружения ошибок вы можете легко подтвердить, что действительно имеете дело с массивами, проверяя квадратные скобки; после этого просто сбрасывая конечную скобку, добавляя запятую, снимая начальную скобку, и добавление "хвоста" должно работать безупречно. Единственное исключение, о котором я могу думать, это если какой-либо массив пуст, вы должны просто вернуть другой String без изменений; опять же, что очень легко проверить как строку.
Я действительно не думаю, что есть какая-то причина сделать его более сложным, чем это.
Ответ 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.
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);
Ответ 4
Использовать метод "Следующий метод" передать весь массив JSON в ArrayList, этот метод вернет кумулятивный 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");
}
Ответ 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
И вот мое решение: вы можете объединить более двух массивов:
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;
}
Ответ 7
Эта функция делает волшебство, добавляя массивы кратных значений, возвращая один 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;
}