У меня действительно сложный вложенный 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
}]}
Большое спасибо!
Хорошо, я нашел решение! Я использовал 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, и вызовите соответствующий обработчик рекурсивно...
Попробуйте использовать json-simple для разбора JSON в кучу вложенных JSONObject
(которые в основном являются картами) и JSONArray
(которые в основном являются списками) и извлекают значения самостоятельно.
Просто узел: PrimaryAddress
указывает, что может быть и SecondaryAddress
, поэтому вложенность не должна меняться, иначе может быть сложно определить, к какому адресу принадлежит StreetAddressLine
.
В этом случае лучшим вопросом будет вопрос: почему структура часто меняется?
parse
JsonParser . Он возвращает универсальныйJsonElement
, который затем можноJsonElement
, чтобы получить поля, которые вы хотите сделать, как хотите.