Разбор действительно сложного вложенного json, структура которого в JAVA постоянно меняется

1

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

Вариант 1 - Самый простой способ сделать это - преобразовать/проанализировать json в объект JAVA. Я пробовал все (gson, JSONObject, Jackson...) Но я не могу преобразовать json, если у меня нет класса java, и поскольку json не следует фиксированной структуре, я не могу преобразовать ее в класс JAVA. Есть ли другая библиотека, которая может преобразовать json в объект java? (Без необходимости использования существующего java-класса для преобразования json в)

Вариант 2 - Или есть способ/библиотека, которую я могу использовать, который, если задана часть json, программа печатает все элементы в json файле. Что-то вроде этого...

StreetAddressLine
PrimaryTownName : value
CountryISOAlpha2Code :value
TerritoryAbbreviatedName :value
PostalCode : value

{"PrimaryAddress": [        {
          "StreetAddressLine": [{"LineText": "492 Koller St"}],
          "PrimaryTownName": "San Francisco",
          "CountryISOAlpha2Code": "US",
          "TerritoryAbbreviatedName": "CA",
          "PostalCode": "94110",
          "AddressUsageTenureDetail": [{"TenureTypeText":           {
            "@DNBCodeValue": 1129,
            "$": "Rents"
          }}],
          "PremisesUsageDetail": [{"PremisesUsageFunctionDetail": [{"PremisesFunctionText":           {
            "@DNBCodeValue": 12058,
            "$": "Manufacturing"
          }}]}],
          "CountyOfficialName": "San Francisco County",
          "TerritoryOfficialName": "California",
          "CountryGroupName": "North America",
          "GeographicalPrecisionText":           {
            "@DNBCodeValue": 0,
            "$": "Unknown"
          },
          "UndeliverableIndicator": false,
          "MetropolitanStatisticalAreaUSCensusCode": ["San Francisco-Oakland-Hayward CA"],
          "RegisteredAddressIndicator": false,
          "ResidentialAddressIndicator": false
        }]}

Большое спасибо!

  • 0
    Если структура постоянно меняется, класс не подойдет. Даже если бы вы нашли библиотеку для генерации класса для вас во время выполнения, вы бы тогда обращались к ней, не зная, существуют ли элементы. Если вы не можете исправить структуру JSON, вам следует использовать динамическую структуру данных, например дерево.
  • 1
    вы можете использовать gson для получения объекта Json, не зная класса, вместо этого используя метод parse JsonParser . Он возвращает универсальный JsonElement , который затем можно JsonElement , чтобы получить поля, которые вы хотите сделать, как хотите.
Показать ещё 3 комментария
Теги:
parsing

2 ответа

1
Лучший ответ

Хорошо, я нашел решение! Я использовал Jackson Parser

Сначала сопоставьте свой jsonString с JsonNode

JsonNode rootNode = mapper.readValue(jsonString, JsonNode.class);

Обновите rootNode, чтобы содержать json для требуемого ключа:

    rootNode = rootNode.findParent(key);

а затем в зависимости от того, является ли это массивом или списком, обрабатывающим его отдельно:

if(rootNode.path(key).isArray()){
//key is the field in the json that you might be looking for
for (final JsonNode objNode : rootNode) {

     for (Iterator<String> keyArray = objNode.getFieldNames(); keyArray.hasNext();){

         fieldName = keyArray.next();

         fieldValue = objNode.path(fieldName).asText();                 
         if(fieldValue != ""){
             System.out.println(fieldName + " = " + fieldValue);

         }else{
             arrayHandler(objNode,fieldName);
         }
     }
 }

На каждой итерации проверьте, является ли полученный JsonNode массивом или списком. Если это List обрабатывает его по-разному (просто перебирайте пары значений ключа, подобные этому)

for (Iterator<String> keyArray = rootNode.getFieldNames(); keyArray.hasNext();){
        fieldName = keyArray.next();
        fieldValue = rootNode.get(fieldName).asText();
        System.out.println(fieldName + " = " + fieldValue);
    }

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

  • 0
    Действительно хороший способ разобрать JSON, чтобы найти ключ!
3

Попробуйте использовать json-simple для разбора JSON в кучу вложенных JSONObject (которые в основном являются картами) и JSONArray (которые в основном являются списками) и извлекают значения самостоятельно.

Просто узел: PrimaryAddress указывает, что может быть и SecondaryAddress, поэтому вложенность не должна меняться, иначе может быть сложно определить, к какому адресу принадлежит StreetAddressLine.

В этом случае лучшим вопросом будет вопрос: почему структура часто меняется?

  • 0
    JSON - это ответ веб-службы, созданной какой-то компанией. Структура изменяется в зависимости от доступной информации. Спасибо за ваше предложение, я проверю это ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню