2017-03-03 1 views
3

Jackson 라이브러리를 사용하여 중복 키가있는 잘못된 구조로 json을 구문 분석하려고합니다. json에 중복 키가있는 경우이를 Collection으로 추출하고 싶습니다.중복 키를 포함하는 json 구문 분석

(I 구문 분석하기 위해 노력하고있어 실제 JSON은 Wireshark JSON 수출에서 온다) 내가 구문 분석하려고 해요의

예 :이 JSON 중복 키를 가지고 있기 때문에, 마지막에만

{ 
    "a": "a", 
    "a": { 
     "b": { 

     }, 
     "b": true 
    } 
} 

그러나 값이 그대로 유지됩니다 :

JsonNode tree = new ObjectMapper().readTree(json); 
System.out.println(tree); // {"a":{"b":true}} 

는 또한 중첩 된 JSON 객체에 대한 예상대로, 그러나 그것은 작동하지 않습니다, Multimap 지원이있는 Guava 모듈을 시도했습니다.

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new GuavaModule()); 
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); 

Multimap read = mapper.readValue(json, Multimap.class); 
System.out.println(read); // {a=[a, {b=true}]} 

가 어떻게 Jackson 라이브러리를 사용하여이 문제를 해결해야합니다 전에 내가 보여

json으로 대한 구아바 모듈을 사용하여 예? java와 같은 json 구조의 구문 분석을 지원하는 다른 라이브러리가 있습니까?

+1

유효한 JSON의

net.sf.json.JSONObject: {"a":["a",{"b":[{},true]}]} com.fasterxml.jackson.databind.JsonNode{"a":["a",{"b":[{},true]}]} 

메이븐 의존성이 너무 구문 분석 라이브러리 방식으로 작동해서는 안, 중복 키가없는 당신 다시 묻습니다. –

+0

SyntaxError : 3 번째 줄에 중복 키 'a'가 있습니다. –

답변

3

json 라이브러리가 융통성이 있다면 net.sf.json.JSONObject을 사용할 수 있습니다.

이 라이브러리는 어레이에 값을 저장하여 중복 된 값을 유지합니다. 여러 개의 동일한 키를 사용할 수있는 경우 하나의 키를 만들어 모든 값을 Array로 만듭니다.

또한 코딩 부분은 단 한 줄에 불과합니다. 일단 net.sf.json.JSONObject를 사용하여 json을 파싱하면 jackson 라이브러리에이를 제공 할 수 있습니다.

JSONObject jsonObject = JSONObject.fromObject("{ \"a\": \"a\", \"a\": { \"b\": {},\"b\": true}}"); 

System.out.println("net.sf.json.JSONObject: " + jsonObject); 

JsonNode jsonNode = new ObjectMapper().readTree(jsonObject.toString()); 

System.out.println("com.fasterxml.jackson.databind.JsonNode" + jsonNode); 

출력 : net.sf.json

<dependency> 
    <groupId>net.sf.json-lib</groupId> 
    <artifactId>json-lib</artifactId> 
    <version>2.4</version> 
    <classifier>jdk15</classifier> 
</dependency> 
+0

중복을 제거하고 배열이 아닌 단일 객체로 유지할 수있는 방법이 있습니까 –

+0

@AtulSoman 불가능 중복 키를 사용하는 한 –

2

"jackson"라이브러리를 사용하여 json 메시지 토큰을 스트리밍 방식으로 읽을 수 있습니다. 그런 다음 메시지에서 아무것도 먹지 않습니다.

+0

나는 모자는 유일한 실행 가능한 접근법이기도합니다. 이 답변에서 시작하는 몇 가지 정보가 있습니다 : http://stackoverflow.com/a/25426227/13075 – Henrik