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
에 준하는 방법이 있습니까?getJSONArray
에org.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
'sourcecode' 카테고리의 다른 글
null이 PHP의 한 줄에 다른 변수를 사용하는 경우 (0) | 2022.11.27 |
---|---|
larabel 5.x에서는 많은 수와 속한 수의 비교 (0) | 2022.11.27 |
C#, C++ 또는 Java 컴파일러를 구동하여 1+2+3+를 계산하는 방법...컴파일 시 +1000? (0) | 2022.11.27 |
MariaDB ODBC 커넥터 성능 문제 (0) | 2022.11.27 |
MariaDB가 이 덤프 파일을 가져올 수 없습니다. (0) | 2022.11.27 |