Estou mudando minha biblioteca JSON de org.json para Jackson e quero migrar o seguinte código:
JSONObject datasets = readJSON(new URL(DATASETS));
JSONArray datasetArray = datasets.getJSONArray("datasets");
Agora em Jackson eu tenho o seguinte:
ObjectMapper m = new ObjectMapper();
JsonNode datasets = m.readTree(new URL(DATASETS));
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets");
Porém não gosto do elenco aí, existe a possibilidade de um ClassCastException
? Existe um método equivalente a getJSONArray
in org.json
para que eu tenha o tratamento de erros adequado caso não seja um array?
FAIL_ON_UNKNOWN_PROPERTIES
recurso do desserializador para obter apenas valores nulos retornados nos campos não utilizados. Mas é claro que isso é apenas uma opção se o conjunto de nomes de campo for relativamente limitado.Respostas:
Sim, o design do analisador manual de Jackson é bastante diferente de outras bibliotecas. Em particular, você notará que
JsonNode
possui a maioria das funções que você normalmente associa a nós de array de outras APIs. Como tal, você não precisa lançar para umArrayNode
para usar. Aqui está um exemplo:JSON:
Código:
Resultado:
Observe o uso de
isArray
para verificar se o nó é realmente uma matriz antes de iterar. A verificação não é necessária se você estiver absolutamente confiante em sua estrutura de dados, mas ela estará disponível caso você precise (e isso não é diferente da maioria das outras bibliotecas JSON).fonte
No Java 8, você pode fazer assim:
fonte
Depende de sua entrada; ou seja, as coisas que você busca no URL. Se o valor do atributo "datasets" for uma matriz associativa em vez de uma matriz simples, você obterá a
ClassCastException
.Mas, novamente, a exatidão de sua versão antiga também depende da entrada. Na situação em que sua nova versão lançar um
ClassCastException
, a versão antiga lançaráJSONException
. Referência: http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)fonte
Eu presumiria que, no final do dia, você deseja consumir os dados no ArrayNode iterando-o. Por isso:
ou se você gosta de streams e funções lambda:
fonte