Тестування двох об'єктів 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.