Разобрать Json с дубликатами - PullRequest
0 голосов
/ 29 мая 2018

Я пытаюсь проанализировать вложенные Json с дубликатами ключей в Java.Я рассмотрел другие подобные вопросы, но не смог найти решение. Я попробовал подход с использованием потокового API Джексона, но он только печатает значение первого ключа и игнорирует второй дубликат ключа.Пожалуйста, помогите. Спасибо заранее.

Код:

public class JacksonJson {
    public static void main(String args[]) throws IOException {


        /
        JsonFactory factory = new JsonFactory();

        JsonParser parser = factory.createParser(new File("a.json"));
        parser.nextToken();                                
        while (parser.nextToken() != JsonToken.END_OBJECT) {    //loop until "}"

            String fieldName = parser.getCurrentName();

            if (fieldName.equals("A")) {
                parser.nextToken();
                System.out.println("Value : " + parser.getText());
            }
             /*else { // unexpected token, generate error
                throw new IOException("Unrecognized field '"+fieldName+"'");
            }*/

        }
        parser.close();
    }
    }

JSON файл:

{
  "Data": {
    "C": {
      "S": {
        "M": {},
        "A": "first"
      }
    },
    "C": {
      "S": {
        "M": {}
        "A": "Second",

      }
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Используйте приведенный ниже код для получения значения json из повторяющихся записей.

public static void main(String args[]) throws IOException {     
    JsonFactory factory = new JsonFactory();
    JsonParser parser = factory.createJsonParser(new File("src/a.json"));
    parser.nextToken();  
    int count=0;
    while (parser.nextToken() != JsonToken.NOT_AVAILABLE) {    //loop until "}"
        String fieldName = parser.getCurrentName();

        if(fieldName==null){
            break;
        }
        if(fieldName.equals("C")&&parser.getText().equals("C")){
            count++;
        }
        if (fieldName.equals("A")) {
            parser.nextToken();
            System.out.println("Value : " + parser.getText());
        }
    }
    System.out.println(count);
    parser.close();
}

А также ваша строка json недействительна.Используйте ниже допустимую строку

 {
  "Data": {
    "C": {
      "S": {
        "M": {},
        "A": "first"
      }
    },
    "C": {
      "S": {
        "M": {},
        "A": "Second"

      }
    }
  }
}
0 голосов
/ 29 мая 2018

С спецификацией JSON

Имя - это строка.После каждого имени стоит двоеточие, отделяющее имя от значения.Одна запятая отделяет значение от следующего имени.Имена внутри объекта ДОЛЖНЫ быть уникальными.

Многие библиотеки JSON предоставляют функциональные возможности для сопоставления json с объектом.Подумайте об этом, как они вообще должны работать, если имена не уникальны?

Конечно, вы можете попытаться разобрать его самостоятельно и переименовать его внутренне в C1, C2, ... но это гораздо прощезапретить такие случаи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...