2017-04-12 1 views
0

포장 파싱에동적 나는 많은 구체적인 구현과 추상 클래스가 JSON 배열

런타임에
"_embedded": { 
    "speedingTickets" : 
    [{ 
     "id":1, 
     "fine": "$190", 
     ..., 
    }, 
    { 
     "id":2, 
     "fine": "$100", 
     ..., 
    }] 
} 

또는

"_embedded": { 
    "parkingTickets" :[{ 
     "id":100, 
     "fine": "$15", 
     ..., 
    }] 
} 

내가 알고하지 않기 때문에

, Ticket 구현 예를 들어, JSON을 사용하여 JSON을 구문 분석 할 수있는 방법은 무엇입니까? 구체화 된 구현의 간단한 이름으로 래핑 된 배열을 사용하여 API Response을 사용할 수 있습니까?

JSON의 String 값을 가져 와서 문자열 연산 (substring, indexOf 등)을 수행하여 중괄호 ("[...]") 사이의 값만 반환하는 해킹이 있습니다.

JsonNode rootNode = mapper.readTree(jsonResponse); 
String classImpl = Iterables.get(rootNode.get("_embedded").fields(), 0).textValue() 

I을 : 나는



은 몇 가지 조사 후, 나는 그것이 작동하는지 내가 볼 다음 내일 시도 할 것 같아요 ...이 할 수있는 더 좋은 방법이 알고 그러면 List<Ticket> tickets = response.readAsList(jsonResponse, "_embedded",classImpl)으로 JSON을 목록으로 구문 분석 할 수 있어야합니다.

+0

가능한 복제 [GSON - 두 개의 서로 다른 키를 사용하여 값을 읽기] (http://stackoverflow.com/questions/35739713/gson-read-a-value-with-two-different-keys) – Bharatesh

+0

제 질문은 동적으로 생성 된 키가있는 json aray를 파싱하는 것입니다. 귀하의 링크는 부동산에 관한 것입니다. – Dan

답변

-1

JSON 개체는 정렬되지 않은 키/값 쌍의 집합입니다. JSON 배열은 값의 정렬 된 컬렉션입니다. 값 자체는 객체 또는 배열 일 수 있습니다. 자바에서

가 어떻게 JSON 배열을 구문 분석하는 org.json 라이브러리 https://github.com/stleary/JSON-java

짧은 예를 JSON을 구문 분석하기 쉽습니다 :

String str = "{ \"number\": [3, 4, 5, 6] }"; 
JSONObject obj = new JSONObject(str); 
JSONArray arr = obj.getJSONArray("number"); 
for (int i = 0; i < arr.length(); i++) 
    System.out.println(arr.getInt(i)); 
+0

내 질문의 요점을 놓치고 있다고 생각합니다. 위의 내용이 "숫자"가 핵심이라는 것을 알고 있다면 작동합니다. 내 상황에서는 키가 동적입니다 (구현 클래스의 단순한 이름으로 결정됩니다). – Dan

0

당신이 (당신의 태그에서 알 수 있듯이) 잭슨을 사용하는 경우, Polymorphic Deserialization을 사용하고 싶습니다. 올바른 하위 유형으로 비 직렬화하는 방법을 아는 것이 정확하게 문제입니다. 예를 들어

이 본질적으로 무엇을

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class") 
class { } 

은 JSON에서 클래스 이름을 포함, 그래서 디시리얼라이저가 제대로 인스턴스화하는 서브 클래스를 선택할 수있는 충분한 정보를 가지고있다. 다음과 같은 형식이 있습니다.

"_embedded": { 
    "parkingTickets" :[{ 
     "_type": "ParkingTicket.class", 
     "id":100, 
     "fine": "$15", 
     ..., 
    }] 
} 
+0

예, 저는 이것을하고 있습니다. 구현을 결정하기 위해 기존 속성 값과 함께 @JsonTypeInfo를 사용하고 있습니다.그러나 제 질문은 제가 작업하고있는 기능 단위 테스트와 관련이 있습니다. 나는 API를 통해 모의 전화를하지만, 구현에 따라 키 ('parkingTickets'또는 'speedingTickets')가 변경되기 때문에 응답을 객체로 되돌릴 수 없습니다. – Dan

+0

질문에 더 포괄적 인 요약을하면 도움이됩니다. 나는 당신이 API의 구현에 기반한 핵심 변화를 의미한다고 가정하고 있는가? API와 클라이언트를 모두 제어하는 ​​경우 직렬화/직렬화가 양 끝에서 완전히 동일하도록 모델을 공유 라이브러리에 넣어야합니다. API를 제어하지 않으면 가장 좋은 방법은 문서에 코드를 작성하는 것입니다. – nighthawk454

+0

구체적인 클래스 이름을 기반으로하는 주요 변경 사항을 의미합니다. 따라서 json 내의 key "speedingTickets"는'SpeedingTicket' 구현에 의해 생성됩니다. 'ParkingTickets'와 동일합니다. "_embedded"다음의 값은 구현 클래스 이름 – Dan

0

응답에 포함 된 변수를 확인하여 유형을 확인할 수 있습니다.

JSONObject jsonObj = new JSONObject(response); 
if(jsonObj.has("speedingTickets")){ 
    // parse speedingTickets 
}else if(jsonObj.has("parkingTickets")){ 
    // parse parkingtickets 
} 
+0

나는 이것을하려고 생각했지만 20 가지 이상의 구현 유형이있다. 나는 이것이 실용적이지 않을 것이라고 생각한다. – Dan