Тестування двох об'єктів JSON на рівність ігнорування порядку дітей на Java


233

Я шукаю бібліотеку розбору JSON, яка підтримує порівняння двох об'єктів JSON, ігноруючи дочірнє замовлення, спеціально для тестування блоку JSON, що повертається з веб-служби.

Чи підтримує це будь-яка з основних бібліотек JSON? Бібліотека org.json просто робить порівняння посилань.


1
Не вдається серіалізувати обидва об'єкти для подання рядків та порівняння? Я думаю, що всі бібліотеки підтримують toString()перетворення об'єкта в JSONрядок.
— Teja Kantamneni

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

Цей метод не є симетричним, оскільки він лише перевіряє "підмножину" співвідношення дітей, а не рівність. "інший" об'єкт може мати більше дітей, ніж у дітей, і цей метод все одно поверне справжнє значення.
— Йоні

23
@Yoni: Неправда, оскільки існує порівняння розмірів. Вони повинні мати точно таку ж кількість дітей, як і однакові діти. @Jolly Roger: У цьому випадку я не серіалізую об'єкт з JSON назад в POJO, але при відправці JSON системи, яка це робить, я не можу розраховувати на те, що він поверне його в тому ж форматі, в якому я надіслав це.
— Джефф

1
@Jeff Це працювало для вас? У липні ствердження рівнянь для мене не вдається. Проект використовує стару версію (1.5), fyi.
— ronnyfm

1
Я думаю, вам не вистачає тестування високого рівня, якщо ви не заявляєте про JSON. У вас може бути тонкий тест, який робить запит http і відповідає на очікуваний JSON - це головна функціональна поведінка веб-служби.
— mogronalol

Лише незначна примітка щодо продуктивності: код, який порівнює 'value' з 'otherValue', може бути спрощений до if (value.equals (other.get (key)) повертає false, оскільки 'value' гарантовано не є null та Метод рівняння JsonNode повинен прийняти нульовий аргумент
— Tillmann

154

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

Його не суворий режим має дві основні переваги, які роблять його менш крихким:

  • Розширюваність об'єкта (наприклад, із очікуваним значенням {id: 1} , це все одно перейде: {id: 1, moredata: 'x'} .)
  • Вільне впорядкування масиву (наприклад, ['собака', 'кішка'] == ['кішка', 'собака'])

У суворому режимі він більше поводиться на тестовий клас 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 () очікуютьсяJSONString , фактичноDataString та isStrict .

Повідомлення результатів досить чіткі, що важливо при порівнянні дійсно великих об'єктів JSON.


18
Я використовував це рішення, але я щойно встановив, що ви також можете надати JSONCompareMode, який ви обрали. Один з яких - NON_EXTENSIBLE. Отже, у вас JSONAssert.assertEquals(expected, data, JSONCompareMode.NON_EXTENSIBLE);вийде щось подібне: Режим NON_EXTENSIBLE означає, що будь-яке нове або відсутнє поле спричиняє збої, але замовлення не робить. Використання помилкових зумовлює поблажливіший режим, який не повідомляє про зайві або відсутні елементи дочірніх елементів.
— Дан Храм

1
Режим порівняння NON_EXTENSIBLE - це саме те , що я шукав. Дякую за це, Ден.
— МисленняКрима

Перш ніж я захоплююсь: чи підтримує ця вкладені JSON об'єкти та масиви? :)
— Крістіан

2
Люди можуть захотіти врахувати цю проблему JSONassert перед використанням бібліотеки: це вказує на те, що в даний час можливі проблеми з ліцензуванням залежно від бібліотеки.
— Chriki

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);

Для мене працює GSON 2.8.2.
— Том Салееба

1
він не працює, якщо елементи jsonArray не в порядку. версія 2.8.2
— Naveen Kumar RB

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);

Якщо ви вже використовуєте Джексона, це найкраща відповідь ІМХО.
— Крістоф Дітце

18
але я думаю, що це суворе порівняння. Він поверне помилковим для двох рівних json, що мають різний порядок елементів.
— дедпул

@deadpool принцип здоровий, вам просто потрібно змінити порівняння, щоб бути більш задіяним (перевірка, наприклад, ключових полів, а не простого рівня дерев).
— jwenting

Це найкраща відповідь коли-небудь. Він не тільки відповідає на моє запитання зараз, як і відповідає майже на кожне порівняння об'єктів, яке нам потрібно зробити. спасибі, Джошу.
— Luiz Feijão Veronesi

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'} ");
— Rob Juurlink

2
Хоча це рішення працює для порядку використання елементів даних у JSON, воно не вдасться, якщо порядок елементів у масивах не збігається. Якщо ваш код використовує набір, який, наприклад, перетворений в 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];
— Dan Temple

Так, це обмеження Json :(. Json.org показує, що немає невпорядкованого маркера колекції. {} Може оточувати лише пари ключових значень. Це дуже дратує
— Merk

15

Використовуйте цю бібліотеку: https://github.com/lukas-krecan/JsonUnit

Пом:

<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)
);

Ви можете додати більше коментарів, як ми можемо використовувати його, я додаю його до моєї пом, але нам потрібен doc, щоб зрозуміти, як ним користуватися
— Ran Adler

впевнене використання дуже просте: додайте це до своєї пом. <dependency> <groupId> net.javacrumbs.json-unit </groupId> <artifactId> json-unit </artifactId> <version> 1.5.0 </version> <scope> test </scope> </dependency>
— chethu

10 разів я переглянув інструкцію за посиланням, і я знайшов її :)
— Ран Адлер

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 безпосередньо для тверджень. ( Я про це писав тут. )


Яка перевага використання матриць для хом'яків замість прямого використання JSONAssert?
— Йоганнес

2
@Johannes: Тільки стиль.
— kevinarpe

Наразі джерела hamcrest-json мають останню дату здійснення 2012 року. Він, можливо, вже не так підтримується.
— Thorbjørn Ravn Andersen

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.

6

Одне, що я зробив, і це творить чудеса - це читати обидва об'єкти в HashMap, а потім порівнювати їх із звичайними атрибутамиEquals (). Він викличе метод equals () хешмапів, який буде рекурсивно порівнювати всі об'єкти всередині (вони будуть або іншими хеш-мапами, або деяким об'єктом з єдиним значенням, таким як рядок або ціле число). Це було зроблено за допомогою аналізатора Jackson JSON Codehaus 'Jackson.

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це недійсно, ви отримаєте NullPointerException з цього кодуif (!val1.equals(val2)) {
— JohnDoDo

Це трапляється і з кращими з нас :). +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.
— Chii

Але уявіть, як написати той код, де 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 це повертає істину, якщо деякі елементи збігаються, на відміну від усіх елементів.
— matiasg

@matiasg - чи if (obj1Array.length() != obj2Array.length())не забезпечить збіг усіх елементів?
— kwah

3
@kwah: ні. Розглянемо цей приклад: obj1Array = [1,1,1], obj2Array = [1,2,3]. Це повернеться правдою. Також, навіть якщо елементи збігаються, вони повинні бути в одному порядку. Це повернеться і для [1,2,3] і [2,3,1] теж, що неправильно
— matiasg

2

Я знаю , що це , як правило , розглядається тільки для тестування , але ви можете використовувати Hamcrest JSON comparitorSameJSONAs в Hamcrest форматі JSON.

Hamcrest JSON SameJSONA


2

Карате - саме те, що ви шукаєте. Ось приклад:

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

(відмова від відповідальності: тут дев)


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.

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. Тут я розмістив деталі у відповіді ТА .


-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

1
Це приємний приклад того, як цього не зробити :)
— Петро zjezdský
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.