Как прочитать значение из json с помощью JsonReader, не зная ключа json

Я пытаюсь использовать TypedArray для анализа json.

Мой json будет следующим:

    {
      "id":"112233",
      "tag":"From server",
      "users":{
      "vijay":1,
      "dhas":2,
      "vijaydhas":3
      }
    }

Здесь ключ объекта пользователя будет динамическим. Я буду получать от сервера во время выполнения. В то время только Я не знаю ключа (виджай, дхас, виджайдхас).

Чтобы разобрать идентификатор и тег, я сделаю следующий код.

           @Override
            public MagazineReader read (JsonReader in) throws IOException {

                final MagazineReader magazineReader = new MagazineReader();

                in.beginObject();
                while (in.hasNext()) {
                    switch (in.nextName()) {
                        case "id":
                            magazineReader.setID(in.nextInt());
                            break;
                        case "tag":
                            magazineReader.setTag(in.nextString());
                            break;
                            in.beginArray();
                            /*
                                                For User how to read the json???
                             */
                }
              in.endObject();
            }

Теперь я хочу прочитать и проанализировать пользовательский JsonArray и его объект, не зная ключа. Я знаю, как разобрать JSONObject, не зная ключа.

JSONObject users= obj.getJSONObject("users");
            Iterator iteratorObj = detailList.keys();
            while (iteratorObj.hasNext())
            {
                String jsonKey = (String)iteratorObj.next();
                property.put(jsonKey,usersList.get(jsonKey));
            }

Но в JsonReader я не знаю, как прочитать значение json, не зная ключа. Пожалуйста помоги мне с этим. [1]: https://javacreed.com/gson-typeadapter-example


person New Developer    schedule 24.08.2020    source источник


Ответы (1)


Вы можете сделать что-то вроде этого:

@Override
public MagazineReader read(JsonReader in) throws IOException {

  final MagazineReader magazineReader = new MagazineReader();
  final Map<String, Object> users = new HashMap<>();

  in.beginObject();
  while (in.hasNext()) {
    switch (in.nextName()) {
      case "id":
        magazineReader.setID(in.nextInt());
        break;
      case "tag":
        magazineReader.setTag(in.nextString());
        break;
      case "users":
        in.beginObject();
        while(in.hasNext()) {
          String key = in.nextName();
          JsonToken type = in.peek();
          if (type == JsonToken.NUMBER) {
            users.put(key, in.nextInt());
          } else if (type == JsonToken.STRING) {
            users.put(key, in.nextString());
          } else {
            System.err.println("Unhandled type: " + type);
          }
        }
        in.endObject();
        break;
    }
    in.endObject();
  }
}

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

Важная часть — начать новый объект, когда вы доберетесь до клавиши users, а затем пройтись по всем свойствам этого объекта. То, как вы обрабатываете записи объекта, зависит от того, что вы пытаетесь сделать.

person Titus    schedule 24.08.2020
comment
Спасибо. Это то, что я хочу. Ваш код и объяснение помогают мне лучше понять. - person New Developer; 26.08.2020