Java - JSON Разбор туда и сюда - PullRequest
0 голосов
/ 14 января 2020

Я прочесывал несколько подходов с разными библиотеками JSON и, похоже, не могу найти элегантный способ преобразования в и из моего JSON файла при тестировании.

JSON внешний вид файла например:

[
  {
    "LonelyParentKey": "Account",
    "ProcessNames": [
      {"Name":  "ProcessOne",
      "Sequence": "1"
      },
      {
        "Name": "ProcessTwo",
        "Sequence": "2"
      },
      {
        "Name": "ProcessThree",
        "Sequence": "3"
      },
      {
        "Name": "ProcessFour",
        "Sequence": "4"
      }
    ]
  }
]

В тесте на основе QAF с использованием TestNG я пытаюсь импортировать значения ключа «ProcessName» следующим образом:

  String lonelyParentKey = (String) data.get("LonelyParentKey");
  ArrayList processNames = (ArrayList) data.get("ProcessNames");

Я видел, что в рамках, который я использую, у меня есть несколько вариантов библиотеки JSON, я пытался использовать GSON после прочтения других сообщений SO.

Итак, следующий в тестовом коде:

  Gson gson = new Gson();
  JSONArray jsa = new JSONArray(processNames);

То, что я пытаюсь создать объект, который содержит 4 дочерних объекта в структуре данных, где я могу получить доступ к ключам Name и Sequence каждого дочернего элемента.

При взгляде на мой jsa объект он выглядит чтобы получить структуру, которая мне нужна, но как я могу получить доступ к ключу Sequence первого дочернего объекта? В REPL в IntelliJ IDEA выполнение jsa.get(0) дает мне "{"Name": "ProcessOne","Sequence": "1"}"

Похоже на ситуацию, в которой карты могут быть полезны, но с просьбой о помощи в выборе правильной структуры данных и предложений по реализации.

ТИА!

Ответы [ 2 ]

1 голос
/ 14 января 2020

Есть ли причина не использовать классы DTO для вашей модели?

например,

class Outer {
    String lonelyParentKey;
    List<Inner> processNames;

    // getter/setter
}

и

class Inner {
    String name;
    String sequence;

    // getter/setter
}

теперь ваша библиотека сможет десериализовать вашу строку JSON в список. Я использовал Джексона вместо GSON, но он должен быть похож на GSON:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
List<X> x = objectMapper.readValue(json, new TypeReference<List<X>>() {});
1 голос
/ 14 января 2020

Не уверен, какую библиотеку вы используете, но все они предлагают почти одинаковые методы. JSONArray выглядит как org. json .JSONArray, так что это будет

JSONArray jsa = new JSONArray(processNames);
int sequenceFirstEntry = jsa.getJSONObject(0).getInt("Sequence");

Некоторые реализации JsonArray также реализуют Iterable, тогда это также работает

JSONArray jsa = new JSONArray(processNames);
for (JSONObject entry : jsa) {
    int sequenceFirstEntry = entry.getInt("Sequence");    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...