sourcecode

Jackson은 캐스팅 없이 JsonNode를 ArrayNode로 전환하는 방법을 알고 계십니까?

copyscript 2022. 11. 27. 21:22
반응형

Jackson은 캐스팅 없이 JsonNode를 ArrayNode로 전환하는 방법을 알고 계십니까?

JSON 라이브러리를 org.json에서 Jackson으로 변경하려고 하는데 다음 코드를 이행하고 싶습니다.

JSONObject datasets = readJSON(new URL(DATASETS));
JSONArray datasetArray =  datasets.getJSONArray("datasets");

잭슨에는 다음과 같은 것이 있습니다.

ObjectMapper m = new ObjectMapper();
JsonNode datasets = m.readTree(new URL(DATASETS));      
ArrayNode datasetArray = (ArrayNode)datasets.get("datasets");

하지만 거기 출연진이 마음에 안 드는데, 출연자가 나올 가능성이 있나요?ClassCastException에 준하는 방법이 있습니까?getJSONArrayorg.json어레이가 아닌 경우에 적절하게 에러를 처리할 수 있도록 하기 위해서?

네, 잭슨의 수동 파서 디자인은 다른 라이브러리와는 상당히 다릅니다.특히, 당신은 그것을 알아차릴 것이다.JsonNode에는 일반적으로 다른 API의 어레이노드와 관련된 대부분의 기능이 있습니다.그 때문에, 캐스트 할 필요는 없습니다.ArrayNode사용할 수 있습니다.다음은 예를 제시하겠습니다.

JSON:

{
    "objects" : ["One", "Two", "Three"]
}

코드:

final String json = "{\"objects\" : [\"One\", \"Two\", \"Three\"]}";

final JsonNode arrNode = new ObjectMapper().readTree(json).get("objects");
if (arrNode.isArray()) {
    for (final JsonNode objNode : arrNode) {
        System.out.println(objNode);
    }
}

출력:

'하나'
'둘'
'셋'

의 사용에 주의해 주세요.isArray반복하기 전에 노드가 실제로 어레이인지 확인합니다.데이터 구조에 자신이 있는 경우에는 체크가 필요하지 않지만 필요할 때 체크할 수 있습니다(이것은 다른 대부분의 JSON 라이브러리와 다르지 않습니다).

Java 8에서는 다음과 같이 실행할 수 있습니다.

import java.util.*;
import java.util.stream.*;

List<JsonNode> datasets = StreamSupport
    .stream(obj.get("datasets").spliterator(), false)
    .collect(Collectors.toList())

결국 ArrayNode의 데이터를 반복하여 소비하는 것으로 가정합니다.그 때문에:

Iterator<JsonNode> iterator = datasets.withArray("datasets").elements();
while (iterator.hasNext()) 
        System.out.print(iterator.next().toString() + " "); 

스트림과 람다 기능에 관심이 있는 경우:

import com.google.common.collect.Streams;
Streams.stream(datasets.withArray("datasets").elements())
    .forEach( item -> System.out.print(item.toString()) )

getJ와 동등한 방법이 있습니까?어레이가 아닌 경우에도 적절하게 오류를 처리할 수 있도록 SONAray를 org.json에 저장해 둡니다.

입력에 따라 다릅니다. 즉, URL에서 가져오는 항목에 따라 다릅니다. "데이터셋" 속성의 값이 일반 배열이 아닌 관련 배열인 경우,ClassCastException.

그러나 이전 버전의 정확성도 입력에 따라 달라집니다.새로운 버전이 새로운 버전을 사용하여ClassCastException이전 버전이 느려집니다.JSONException. 레퍼런스 : http://www.json.org/javadoc/org/json/JSONObject.html#getJSONArray(java.lang.String)

JsonNode를 호출하여 반복기를 입수합니다.iterator()방법, 그리고 계속...

  JsonNode array = datasets.get("datasets");

  if (array.isArray()) {
      Iterator<JsonNode> itr = array.iterator();
      /* Set up a loop that makes a call to hasNext().
      Have the loop iterate as long as hasNext() returns true.*/
      while (itr.hasNext()) {
          JsonNode item=itr.next();
          // do something with array elements
      }
  }

언급URL : https://stackoverflow.com/questions/16788213/jackson-how-to-transform-jsonnode-to-arraynode-without-casting

반응형