при использовании Map‹k,v› сохранить поле и значение, как получить результат, если параметры не уверены

В моем проекте есть такой файл JSON:

{
"table1": [],
"table2": [{
    "field1": "value1",
    "field2": "value2",
    "field3": "value3"
}],
"table3": []
}

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

    public static JSONObject getChildNode(JSONObject json, String nodeName, 
    String fieldName1,Object filedValue1, String fieldName2,Object filedValue2) {
    JSONArray jsonArray = (JSONArray) json.get(nodeName);
    JSONObject jsonObject = null;
    for (int i = 0; i < jsonArray.size(); i++) {
        jsonObject = (JSONObject) jsonArray.get(i);
        String value1 = (String) jsonObject.get(fieldName1);
        String value2 = (String) jsonObject.get(fieldName2);
        if (value1.equals(filedValue1) && value2.equals(filedValue2)) {
            return jsonObject;
        }
    }
    return null;
}

Теперь я хочу использовать карту для хранения параметров, ключ — fieldName, а значение — значение поля, как это:

public JSONObject getChildNode(JSONObject json, String nodeName, Map<String, Object> map) {}

Проблема в том, что я не знаю, сколько параметров он будет передавать, но каждое значение карты должно равняться значению значения jsonArray. И, наконец, верните нужный мне JSONObject.

Есть ли кто-нибудь, кто может мне помочь? Большое спасибо.

Я написал код, как показано ниже:

    public JSONObject getChildNode(JSONObject json, String nodeName, Map<String, Object> map) {
       JSONArray jsonArray = (JSONArray) json.get(nodeName);
       JSONObject jsonObject,jsonObjectTmp  = null;

       for(int i=0; i<jsonArray.size(); i++) {
            jsonObject = (JSONObject) jsonArray.get(i);

            for (String key : map.keySet()) {
                String jsonKey = (String) jsonObject.get(key);
                if (jsonKey.equals(map.get(key))){
                    jsonObjectTmp = jsonObject;
                }else {
                    jsonObjectTmp = null;
                    break;
                }
            }
        }

        return jsonObjectTmp;
}

но я не знаю, где я должен вернуть JSONObject?

Добавить код:

    public JSONObject getChildNode(JSONObject json, String nodeName, Map<String, Object> map) {
       JSONArray jsonArray = (JSONArray) json.get(nodeName);
       JSONObject jsonObject = null;
       boolean flag;
       for(int i=0; i<jsonArray.size(); i++) {
            jsonObject = (JSONObject) jsonArray.get(i);
            flag = mapsAreEqual(jsonObject, map);
            if (flag) {
                return jsonObject;
            }
        }
        return null;
}

public static boolean mapsAreEqual(Map<String, Object> mapA, Map<String, Object> mapB) {

    try{
        for (String k : mapB.keySet())
        {

            if (mapA.get(k).hashCode() != mapB.get(k).hashCode()) {
                return false;
            }
        } 
    } catch (NullPointerException np) {
        return false;
    }
    return true;
}

person leo    schedule 19.08.2015    source источник
comment
Я не знаю, сколько параметров он будет передавать, но каждое значение карты должно равняться значению значения jsonArray что? Поскольку это неясно, возможно, вы могли бы добавить какой-то пример в проиллюстрировать ваши потребности   -  person    schedule 19.08.2015
comment
Я добавил еще немного кода, можете ли вы просмотреть его еще раз? Спасибо.   -  person leo    schedule 19.08.2015
comment
Что-то не так с map.get(jsonKey)?   -  person    schedule 19.08.2015
comment
Я протестировал его, и он вернул ожидаемый результат, но я не уверен, все ли в порядке, так что вы можете помочь мне проверить его? Благодарность   -  person leo    schedule 19.08.2015


Ответы (1)


Просто передайте карту параметров в метод getChildNodeMethod, как вы уже упоминали:

public JSONObject getChildNode(JSONObject json, String nodeName, Map<String, Object> map) {}

Затем, на первом этапе, прокрутите свой массив json (как вы уже делаете) и запишите записи в дополнительную карту. На втором этапе вы сравните две карты. Убедитесь, что вы не сравниваете порядок пар ключ-значение, если это не предназначено.

Вот еще один вопрос о том, как сравнить две карты: Сравнение две хэш-карты для одинаковых значений и одинаковых наборов ключей?

person flogy    schedule 19.08.2015
comment
Я написал код и добавил его к вопросу, можете ли вы дать мне несколько советов? Спасибо. - person leo; 19.08.2015
comment
когда я зацикливаю карту (параметр), я не уверен, где я должен вернуть JSONObject - person leo; 19.08.2015
comment
Зависит от того, чего вы пытаетесь достичь. Как я понял, вы хотите сравнить параметры на карте с массивом json. Если все равно, вы хотите вернуть объект json, если нет, вернуть ноль. Верно? Я бы предложил вам реализовать это, как описано в моем ответе. - person flogy; 19.08.2015
comment
да, как вы сказали, если все равно, вы хотите вернуть объект json, если нет, вернуть ноль. Я пытаюсь реализовать описанный вами ответ, еще один вопрос: когда я зацикливаю массив json, мне нужно поместить все поле на другую карту? А потом сравнить две карты? - person leo; 19.08.2015
comment
В яблочко. Таким образом, у вас будет меньше усилий при фактическом сравнении. - person flogy; 19.08.2015
comment
Привет, я обнаружил, что JSONObject реализует интерфейс карты, поэтому я думаю, что его можно сравнивать напрямую? - person leo; 19.08.2015
comment
Ах, здорово! Так будет проще, попробуйте ;) Опять же, убедитесь, что вы не сравниваете порядок элементов, если это не предназначено. - person flogy; 19.08.2015
comment
Я обнаружил, что мне трудно закончить эту работу, не могли бы вы дать мне несколько советов, как убедиться, что все поля на карте (параметр) равны и возвращаются? - person leo; 19.08.2015
comment
Я пишу метод и тестирую его, можете ли вы просмотреть его, если он правильный? - person leo; 19.08.2015
comment
Выглядит хорошо для меня, за исключением того, что вы еще не проверяете значения на карте, а только ключи. Я думаю, вы не только хотите проверить, равны ли имена полей (ключи), но и равны ли все пары имени поля и значения поля (-> пары ключ-значение). - person flogy; 20.08.2015