Тестирование двух объектов JSON на равенство, игнорируя дочерний порядок в Java

234

Я ищу библиотеку анализа JSON, которая поддерживает сравнение двух объектов JSON, игнорирующих дочерний порядок, особенно для модульного тестирования JSON, возвращающегося из веб-службы.

Поддерживает ли это какая-либо из основных библиотек JSON? Библиотека org.json просто выполняет сравнение ссылок.

Джефф
источник
1
Не можете сериализовать оба объекта в строковое представление и сравнить? Я предполагаю, что все библиотеки поддерживают toString()преобразование объекта в JSONстроку.
Теджа Кантамнени
47
Это предполагает, что порядок сериализации в и из строк всегда одинаков. Мне не удобно делать такое предположение.
Джефф
Ты прав, Джефф, это совсем не безопасно. В этом тесте показан сценарий, в котором сопоставления совпадают, но toString () не возвращает тот же вывод: gist.github.com/anonymous/5974797 . Это потому, что базовый HashMap может расти, и если вы удаляете ключи, внутренний массив HashMap не уменьшается.
Гийом Перро

Ответы:

84

В качестве общего архитектурного аспекта я обычно советую не допускать, чтобы зависимости от конкретного формата сериализации выходили за пределы вашего уровня хранения / сети; таким образом, я бы сначала рекомендовал рассмотреть возможность проверки равенства между собственными объектами приложения, а не их проявлениями JSON.

Сказав это, я в настоящее время большой поклонник Джексона, который, как показывает мой краткий обзор их реализации ObjectNode.equals (), выполняет сравнение набора членов, которое вы хотите:

public boolean equals(Object o)
{
    if (o == this) return true;
    if (o == null) return false;
    if (o.getClass() != getClass()) {
        return false;
    }
    ObjectNode other = (ObjectNode) o;
    if (other.size() != size()) {
        return false;
    }
    if (_children != null) {
        for (Map.Entry<String, JsonNode> en : _children.entrySet()) {
            String key = en.getKey();
            JsonNode value = en.getValue();

            JsonNode otherValue = other.get(key);

            if (otherValue == null || !otherValue.equals(value)) {
                return false;
            }
        }
    }
    return true;
}
Веселый Роджер
источник
Этот метод не является симметричным, поскольку он проверяет только отношения «подмножеств» детей, а не равенство. у «другого» объекта может быть больше потомков, чем у _children, и этот метод все равно вернет true.
Йони
23
@Yoni: Не правда, так как есть сравнение размеров. У них должно быть одинаковое количество детей, а также одинаковые дети. @Jolly Roger: В этом случае я не сериализую объект из JSON обратно в POJO, но при отправке JSON системы, которая делает это, я не могу рассчитывать на его отправку обратно в том же формате, в котором я отправил Это.
Джефф
1
@ Джефф Это сработало для тебя? В junit assertEquals не работает для меня. В проекте используется старая версия (1.5), к вашему сведению.
ronnyfm
1
Я думаю, что вам не хватает тестов высокого уровня, если вы не утверждаете JSON. У вас может быть тонкий тест, который делает http-запрос и отвечает ожидаемым JSON - это основное функциональное поведение веб-службы.
Могроналол
Небольшое замечание относительно производительности: код, который сравнивает 'value' с 'otherValue', можно упростить до if (value.equals (other.get (key))), возвращающего false; так как 'value' гарантированно будет не нулевым и Метод equals () в JsonNode должен принимать нулевой аргумент
Tillmann
154

Попробуйте JSONAssert от Skyscreamer .

Его строгий режим имеет два основных преимущества, которые делают его менее хрупким:

  • Расширяемость объекта (например, с ожидаемым значением {id: 1} , это все равно будет проходить: {id: 1, moredata: 'x'} .)
  • Свободный порядок массивов (например, ['dog', 'cat'] == ['cat', 'dog'])

В строгом режиме он больше похож на тестовый класс json-lib.

Тест выглядит примерно так:

@Test
public void testGetFriends() {
    JSONObject data = getRESTData("/friends/367.json");
    String expected = "{friends:[{id:123,name:\"Corby Page\"}"
        + ",{id:456,name:\"Solomon Duskis\"}]}";
    JSONAssert.assertEquals(expected, data, false);
}

Параметры в JSONAssert.assertEquals () вызова являются expectedJSONString , actualDataString и isStrict .

Полученные сообщения довольно ясны, что важно при сравнении действительно больших объектов JSON.

Картер Пейдж
источник
18
Я использовал это решение, но я только что обнаружил, что вы также можете предоставить JSONCompareMode по вашему выбору. Одним из которых является NON_EXTENSIBLE. Таким образом, у вас будет что-то вроде этого: JSONAssert.assertEquals(expected, data, JSONCompareMode.NON_EXTENSIBLE);режим NON_EXTENSIBLE означает, что любые новые или пропущенные поля вызывают сбои, а порядок - нет. Использование false вызовет снисходительный режим, который не будет сообщать о каких-либо дополнительных или отсутствующих дочерних элементах.
Дан Темпл
1
Режим сравнения NON_EXTENSIBLE - именно то , что я искал. Спасибо за это, Дэн.
ThoughtCrhyme
Прежде чем я все взволнован: поддерживает ли это также вложенные объекты и массивы JSON? :)
Кристиан
2
Люди могут захотеть принять во внимание эту проблему JSONassert перед использованием библиотеки: это указывает на то, что в настоящее время существуют потенциальные проблемы лицензирования с зависимостью библиотеки.
Чрики
3
Исправлена ​​проблема JSONAssert # 44 с заменой библиотеки чистой комнаты в PR 67, выпущенном сегодня как JSONAssert 1.4.0.
Картер Пейдж
49

Использование GSON

JsonParser parser = new JsonParser();
JsonElement o1 = parser.parse("{a : {a : 2}, b : 2}");
JsonElement o2 = parser.parse("{b : 2, a : {a : 2}}");
assertEquals(o1, o2);

Редактировать: С GSON v2.8.6, метод экземпляра JsonParser.parseустарел. Вы должны использовать статический метод JsonParser.parseString:

JsonElement o1 = JsonParser.parseString("{a : {a : 2}, b : 2}");
JsonElement o2 = JsonParser.parseString("{b : 2, a : {a : 2}}");
assertEquals(o1, o2);
axelhzf
источник
У меня работает в GSON 2.8.2.
Том Салеба
1
это не работает, если элементы jsonArray не в порядке. версия 2.8.2
Навин Кумар РБ,
1
Не работает для меня, если порядок объекта / элемента отличается
Jknair
Это сработало для меня, потому что я просто хотел его для модульного теста, в котором два свойства jsons имели одинаковый порядок
GabrielBB
@GabrielBB Вы должны отредактировать вопрос и указать, в какой версии API устарел, и в какой версии начинает работать новый стиль кода.
ясный свет
30

Я бы сделал следующее,

JSONObject obj1 = /*json*/;
JSONObject obj2 = /*json*/;

ObjectMapper mapper = new ObjectMapper();

JsonNode tree1 = mapper.readTree(obj1.toString());
JsonNode tree2 = mapper.readTree(obj2.toString());

return tree1.equals(tree2);
мистифицировать
источник
Если вы уже используете Джексона, это лучший ответ IMHO.
Кристоф Дитце
18
но это строгое сравнение, я думаю. Он вернет false для двух одинаковых json, имеющих разный порядок элементов.
Дэдпул
@deadpool принцип здравый, вам просто нужно изменить сравнение, чтобы оно было более сложным (например, проверка ключевых полей, а не простых равных деревьев).
17
Это самый лучший ответ. Теперь он отвечает не только на мой вопрос, но и практически на каждое сравнение объектов, которое нам нужно сделать. спасибо джошу
Луис Фейао Веронези
2
@ deadpool, это могло быть строгое сравнение, но сейчас оно не строгое.
Андрей Дамиан-Фекете
18

Вы можете попробовать использовать класс JSONAssert от json-lib :

JSONAssert.assertEquals(
  "{foo: 'bar', baz: 'qux'}",
  JSONObject.fromObject("{foo: 'bar', baz: 'xyzzy'}")
);

дает:

junit.framework.ComparisonFailure: objects differed at key [baz]; expected:<[qux]> but was:<[xyzzy]>
Герцшпрунга
источник
Или еще проще: JSONAssert.assertJsonEquals ("{foo: 'bar', baz: 'qux'}", {foo: 'bar', baz: 'xyzzy'} ");
Роб Джурлинк
2
Хотя это решение работает для порядка элементов данных в JSON, оно не будет работать, если порядок элементов в массивах не совпадает. Если ваш код использует Set, который конвертируется, например, в JSON. Следующее сравнение JSON не будет выполнено: JSONAssert.assertJsonEquals( "{foo: 'bar', list: [{test: '1'}, {rest: '2'}] }", "{ foo: 'bar', list: [{rest: '2'}, {test: '1'}] }"); С сообщением:junit.framework.AssertionFailedError: : : objects differed at key [list];: arrays first differed at element [0];: objects differed at key [test];
Дан Темпл
Да, это ограничение Json :(. Json.org показывает, что нет неупорядоченного токена коллекции. {} Может окружать только пары ключ-значение. Это очень раздражает
Merk
15

Используйте эту библиотеку: https://github.com/lukas-krecan/JsonUnit

Pom:

<dependency>
    <groupId>net.javacrumbs.json-unit</groupId>
    <artifactId>json-unit</artifactId>
    <version>1.5.0</version>
    <scope>test</scope>
</dependency>

IGNORING_ARRAY_ORDER - игнорирует порядок в массивах

assertJsonEquals("{\"test\":[1,2,3]}",
  "{\"test\":  [3,2,1]}",
  when(IGNORING_ARRAY_ORDER)
);
chethu
источник
Вы можете добавить больше комментариев, как мы можем использовать это, я добавляю это в свой pom, но нам нужен документ, чтобы понять, как его использовать
Ран Адлер
уверен, что использование очень просто: добавьте это к вашей поме. <зависимость> <groupId> net.javacrumbs.json-unit </ groupId> <artifactId> json-unit </ artifactId> <версия> 1.5.0 </ version> <scope> test </ scope> </ dependency>
Чету
10x Я посмотрел инструкцию по ссылке, и нашел ее :)
Ран Адлер
12

Если вы уже используете JUnit, в последней версии теперь используется Hamcrest. Это общая структура сопоставления (особенно полезная для модульного тестирования), которую можно расширить для создания новых сопоставителей.

Существует небольшая библиотека hamcrest-jsonс открытым исходным кодом, которая называется с JSON-совместимыми совпадениями. Это хорошо документировано, протестировано и поддерживается. Ниже приведены несколько полезных ссылок:

Пример кода с использованием объектов из библиотеки JSON org.json.simple:

Assert.assertThat(
    jsonObject1.toJSONString(),
    SameJSONAs.sameJSONAs(jsonObject2.toJSONString()));

При желании вы можете (1) разрешить массивы «любого порядка» и (2) игнорировать дополнительные поля.

Поскольку существует множество библиотек JSON для Java ( Jackson, GSON, json-libи т.д.), это полезно , что hamcrest-jsonподдерживает JSON текст (как java.lang.String), а также изначально поддерживающие объекты из библиотеки JSON Дугласа Крокфорда вorg.json .

Наконец, если вы не используете JUnit, вы можете использовать Hamcrest напрямую для утверждений. ( Я написал об этом здесь. )

kevinarpe
источник
В чем преимущество использования сопоставителей hacracrast вместо непосредственного использования JSONAssert?
Йоханнес
2
@ Йоханнес: Стиль только.
Кевинарпе
Источники hamcrest-json в настоящее время имеют дату последнего принятия в 2012 году. Возможно, это уже не так хорошо поддерживается.
Турбьерн Равн Андерсен
11

Вы можете попробовать JsonUnit . Он может сравнивать два объекта JSON и сообщать о различиях. Он построен на вершине Джексона.

Например

assertJsonEquals("{\"test\":1}", "{\n\"test\": 2\n}");

Результаты в

java.lang.AssertionError: JSON documents are different:
Different value found in node "test". Expected 1, got 2.
Lukas
источник
6

Одна вещь, которую я сделал, и она творит чудеса - это прочитать оба объекта в HashMap, а затем сравнить с обычным assertEquals (). Он вызовет метод equals () хеш-карт, который будет рекурсивно сравнивать все объекты внутри (это будут либо другие хеш-карты, либо какой-либо объект с одним значением, например, строка или целое число). Это было сделано с помощью JSON-парсера Codehaus JSON.

assertEquals(mapper.readValue(expectedJson, new TypeReference<HashMap<String, Object>>(){}), mapper.readValue(actualJson, new TypeReference<HashMap<String, Object>>(){}));

Аналогичный подход можно использовать, если вместо этого объект JSON является массивом.

Клаудио Агиар
источник
6

Я использую это, и отлично работает для меня (с org.json. *):

package com.project1.helpers;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class JSONUtils {

    public static boolean areEqual(Object ob1, Object ob2) throws JSONException {
        Object obj1Converted = convertJsonElement(ob1);
        Object obj2Converted = convertJsonElement(ob2);
        return obj1Converted.equals(obj2Converted);
    }

    private static Object convertJsonElement(Object elem) throws JSONException {
        if (elem instanceof JSONObject) {
            JSONObject obj = (JSONObject) elem;
            Iterator<String> keys = obj.keys();
            Map<String, Object> jsonMap = new HashMap<>();
            while (keys.hasNext()) {
                String key = keys.next();
                jsonMap.put(key, convertJsonElement(obj.get(key)));
            }
            return jsonMap;
        } else if (elem instanceof JSONArray) {
            JSONArray arr = (JSONArray) elem;
            Set<Object> jsonSet = new HashSet<>();
            for (int i = 0; i < arr.length(); i++) {
                jsonSet.add(convertJsonElement(arr.get(i)));
            }
            return jsonSet;
        } else {
            return elem;
        }
    }
}
ловец
источник
4

Для org.json я развернул свое собственное решение, метод, который сравнивается с экземплярами JSONObject. Я не работал со сложными объектами JSON в этом проекте, поэтому я не знаю, работает ли это во всех сценариях. Кроме того, учитывая, что я использую это в модульных тестах, я не прикладывал усилий к оптимизации. Вот:

public static boolean jsonObjsAreEqual (JSONObject js1, JSONObject js2) throws JSONException {
    if (js1 == null || js2 == null) {
        return (js1 == js2);
    }

    List<String> l1 =  Arrays.asList(JSONObject.getNames(js1));
    Collections.sort(l1);
    List<String> l2 =  Arrays.asList(JSONObject.getNames(js2));
    Collections.sort(l2);
    if (!l1.equals(l2)) {
        return false;
    }
    for (String key : l1) {
        Object val1 = js1.get(key);
        Object val2 = js2.get(key);
        if (val1 instanceof JSONObject) {
            if (!(val2 instanceof JSONObject)) {
                return false;
            }
            if (!jsonObjsAreEqual((JSONObject)val1, (JSONObject)val2)) {
                return false;
            }
        }

        if (val1 == null) {
            if (val2 != null) {
                return false;
            }
        }  else if (!val1.equals(val2)) {
            return false;
        }
    }
    return true;
}
Виктор Ионеску
источник
1
Поскольку вы упомянули оптимизацию :), если значение val1равно null, вы получите if (!val1.equals(val2)) {
исключение
Это случается и с лучшими из нас :). +1 за исправление в вашем ответе.
JohnDoDo
точка взята :) Надеюсь, что она не получит слишком много голосов, в противном случае это будет много поддержки.
Виктор Ионеску
1
Вы не рассматривали, если js2есть nullили нет, когда js1нетnull
Сяо
Этот код не работает для вложенных объектов / последовательностей.
FabienB
3

Вы можете использовать библиотеку zjsonpatch , которая представляет информацию о различиях в соответствии с RFC 6902 (JSON Patch). Его очень легко использовать. Пожалуйста, посетите страницу описания для его использования

Гопи Вишвакарма
источник
2

Я бы взял библиотеку по адресу http://json.org/java/ и equalsизменил метод JSONObject и JSONArray, чтобы выполнить тест на глубокое равенство. Чтобы убедиться, что он работает независимо от порядка дочерних элементов, все, что вам нужно сделать, это заменить внутреннюю карту на TreeMapили использовать что-то подобное Collections.sort().

Йони
источник
4
его не так уж и много - он действительно должен был прийти с кодом для сравнения json.
Чии
Но представьте себе, что вы пишете код, где JSON может быть чем угодно в любой структуре ... напишите сравнение! Это как написание сравнения для всех типов HTML-страниц.
JPM
2

Попробуй это:

public static boolean jsonsEqual(Object obj1, Object obj2) throws JSONException

    {
        if (!obj1.getClass().equals(obj2.getClass()))
        {
            return false;
        }

        if (obj1 instanceof JSONObject)
        {
            JSONObject jsonObj1 = (JSONObject) obj1;

            JSONObject jsonObj2 = (JSONObject) obj2;

            String[] names = JSONObject.getNames(jsonObj1);
            String[] names2 = JSONObject.getNames(jsonObj1);
            if (names.length != names2.length)
            {
                return false;
            }

            for (String fieldName:names)
            {
                Object obj1FieldValue = jsonObj1.get(fieldName);

                Object obj2FieldValue = jsonObj2.get(fieldName);

                if (!jsonsEqual(obj1FieldValue, obj2FieldValue))
                {
                    return false;
                }
            }
        }
        else if (obj1 instanceof JSONArray)
        {
            JSONArray obj1Array = (JSONArray) obj1;
            JSONArray obj2Array = (JSONArray) obj2;

            if (obj1Array.length() != obj2Array.length())
            {
                return false;
            }

            for (int i = 0; i < obj1Array.length(); i++)
            {
                boolean matchFound = false;

                for (int j = 0; j < obj2Array.length(); j++)
                {
                    if (jsonsEqual(obj1Array.get(i), obj2Array.get(j)))
                    {
                        matchFound = true;
                        break;
                    }
                }

                if (!matchFound)
                {
                    return false;
                }
            }
        }
        else
        {
            if (!obj1.equals(obj2))
            {
                return false;
            }
        }

        return true;
    }
Миша
источник
в jsonArrays это возвращает true, если некоторые элементы совпадают, в отличие от всех элементов совпадают.
matiasg
@matiasg - if (obj1Array.length() != obj2Array.length())не гарантирует, что все элементы совпадают?
Кв
3
@kwah: Нет. Рассмотрим этот пример: obj1Array = [1,1,1], obj2Array = [1,2,3]. Это вернет истину. Кроме того, даже если элементы совпадают, они должны быть в том же порядке. Это вернет true для [1,2,3] и [2,3,1] тоже, что неверно
matiasg
2

Я знаю, что это обычно рассматривается только для тестирования, но вы можете использовать Hamcrest JSON compitorSameJSONAs в Hamcrest JSON.

Hamcrest JSON SameJSONAs

Джастин ом
источник
2

Каратэ это именно то, что вы ищете. Вот пример:

* def myJson = { foo: 'world', hey: 'ho', zee: [5], cat: { name: 'Billie' } }
* match myJson = { cat: { name: 'Billie' }, hey: 'ho', foo: 'world', zee: [5] }

(отказ от ответственности: dev здесь)

Питер Томас
источник
2

Для сравнения jsons я рекомендую использовать JSONCompare: https://github.com/fslev/json-compare

// Compare by regex
String expected = "{\"a\":\".*me.*\"}";
String actual = "{\"a\":\"some text\"}";
JSONCompare.assertEquals(expected, actual);  // True

// Check expected array has no extra elements
String expected = "[1,\"test\",4,\"!.*\"]";
String actual = "[4,1,\"test\"]";
JSONCompare.assertEquals(expected, actual);  // True

// Check expected array has no numbers
String expected = "[\"\\\\\\d+\"]";
String actual = "[\"text\",\"test\"]";
JSONCompare.assertEquals(expected, actual);  // True

// Check expected array has no numbers
String expected = "[\"\\\\\\d+\"]";
String actual = "[2018]";
JSONCompare.assertNotEquals(expected, actual);  // True
Слев Флорин
источник
0

Для таких как я, желающих сделать это с Джексоном, вы можете использовать json-unit .

JsonAssert.assertJsonEquals(jsonNode1, jsonNode2);

Ошибки дают полезную информацию о типе несоответствия:

java.lang.AssertionError: JSON documents have different values:
Different value found in node "heading.content[0].tag[0]". Expected 10209, got 10206.
krookedking
источник
0

Ничто другое, казалось, не работало совершенно правильно, поэтому я написал это:

private boolean jsonEquals(JsonNode actualJson, JsonNode expectJson) {
    if(actualJson.getNodeType() != expectJson.getNodeType()) return false;

    switch(expectJson.getNodeType()) {
    case NUMBER:
        return actualJson.asDouble() == expectJson.asDouble();
    case STRING:
    case BOOLEAN:
        return actualJson.asText().equals(expectJson.asText());
    case OBJECT:
        if(actualJson.size() != expectJson.size()) return false;

        Iterator<String> fieldIterator = actualJson.fieldNames();
        while(fieldIterator.hasNext()) {
            String fieldName = fieldIterator.next();
            if(!jsonEquals(actualJson.get(fieldName), expectJson.get(fieldName))) {
                return false;
            }
        }
        break;
    case ARRAY:
        if(actualJson.size() != expectJson.size()) return false;
        List<JsonNode> remaining = new ArrayList<>();
        expectJson.forEach(remaining::add);
        // O(N^2)   
        for(int i=0; i < actualJson.size(); ++i) {
            boolean oneEquals = false;
            for(int j=0; j < remaining.size(); ++j) {
                if(jsonEquals(actualJson.get(i), remaining.get(j))) {
                    oneEquals = true;
                    remaining.remove(j);
                    break;
                }
            }
            if(!oneEquals) return false;
        }
        break;
    default:
        throw new IllegalStateException();
    }
    return true;
}
Алекс Р
источник
0

Следующий код будет более полезным для сравнения двух JsonObject, JsonArray, JsonPrimitive и JasonElements.

private boolean compareJson(JsonElement json1, JsonElement json2) {
        boolean isEqual = true;
        // Check whether both jsonElement are not null
        if (json1 != null && json2 != null) {

            // Check whether both jsonElement are objects
            if (json1.isJsonObject() && json2.isJsonObject()) {
                Set<Entry<String, JsonElement>> ens1 = ((JsonObject) json1).entrySet();
                Set<Entry<String, JsonElement>> ens2 = ((JsonObject) json2).entrySet();
                JsonObject json2obj = (JsonObject) json2;
                if (ens1 != null && ens2 != null) {
                    // (ens2.size() == ens1.size())
                    // Iterate JSON Elements with Key values
                    for (Entry<String, JsonElement> en : ens1) {
                        isEqual = isEqual && compareJson(en.getValue(), json2obj.get(en.getKey()));
                    }
                } else {
                    return false;
                }
            }

            // Check whether both jsonElement are arrays
            else if (json1.isJsonArray() && json2.isJsonArray()) {
                JsonArray jarr1 = json1.getAsJsonArray();
                JsonArray jarr2 = json2.getAsJsonArray();
                if (jarr1.size() != jarr2.size()) {
                    return false;
                } else {
                    int i = 0;
                    // Iterate JSON Array to JSON Elements
                    for (JsonElement je : jarr1) {
                        isEqual = isEqual && compareJson(je, jarr2.get(i));
                        i++;
                    }
                }
            }

            // Check whether both jsonElement are null
            else if (json1.isJsonNull() && json2.isJsonNull()) {
                return true;
            }

            // Check whether both jsonElement are primitives
            else if (json1.isJsonPrimitive() && json2.isJsonPrimitive()) {
                if (json1.equals(json2)) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else if (json1 == null && json2 == null) {
            return true;
        } else {
            return false;
        }
        return isEqual;
    }
Рададия Никунь
источник
0

Глядя на ответы, я попробовал JSONAssert, но это не удалось. Поэтому я использовал Джексона с zjsonpatch. Я разместил подробности в SO ответе здесь .

likejudo
источник
-5

Это решение для меня, работа очень хорошая:

try {           
                // Getting The Array "Courses" from json1 & json2   
                Courses1 =json1.getJSONArray(TAG_COURSES1);
                Courses2 = json2.getJSONArray(TAG_COURSES);

                //LOOP FOR JSON1
                for(int i = 0; i < Courses1.length(); i++){
                    //LOOP FOR JSON2
                    for(int ii = 0; ii < Courses2.length(); ii++){
                        JSONObject courses1 = Courses1.getJSONObject(i);
                        JSONObject courses2 = Courses2.getJSONObject(ii);

                        // Storing each json1 item in variable
                        int courseID1 = courses1.getInt(TAG_COURSEID1);
                        Log.e("COURSEID2:", Integer.toString(courseID1));
                        String Rating1 = courses1.getString(TAG_RATING1);
                        int Status1 = courses1.getInt(TAG_STATUS1);
                        Log.e("Status1:", Integer.toString(Status1));      //Put the actual value for Status1 in log.             

                        // Storing each json2 item in variable
                        int courseID2 = courses2.getInt(TAG_COURSEID);
                        Log.e("COURSEID2:", Integer.toString(courseID));   //Put the actual value for CourseID in log
                        String Title2 = courses2.getString(TAG_TITLE);                      
                        String instructor2 = courses2.getString(TAG_INSTRUCTOR);
                        String length2 = courses2.getString(TAG_LENGTH);
                        String rating2 = courses2.getString(TAG_RATING);
                        String subject2 = courses2.getString(TAG_SUBJECT);
                        String description2 = courses2.getString(TAG_DESCRIPTION);

                        //Status1 = 5 from json1; Incomplete, Status1 =-1 Complete 
                        if(Status1 == 5 && courseID2 == courseID1){                                  

                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();         
                        //Storing the elements if condition is true.
                        map.put(TAG_COURSEID, Integer.toString(courseID2)); //pend for compare
                        map.put(TAG_TITLE, Title2);
                        map.put(TAG_INSTRUCTOR, instructor2);
                        map.put(TAG_LENGTH, length2);
                        map.put(TAG_RATING, rating2);
                        map.put(TAG_SUBJECT, subject2); //show it
                        map.put(TAG_DESCRIPTION, description2);

                        //adding HashList to ArrayList
                        contactList.add(map);
                        }//if
                    }//for2 (json2)
                } //for1 (json1)                
            }//Try

Надеюсь, что это поможет другим.

JLouis
источник
конечно, просто поставьте свои ценности и условия, и вид зрения, в этом случае; Hashmap поверх списка.
JLouis
1
Это хороший пример того, как этого не делать :)
Petr Újezdský