2017-10-27 4 views
1

저는 Spring MVC 애플리케이션에서 Jackson을 사용하고 있습니다. > JSONJackson JSON 키의 값이 Java로

"record": { 
     "<Dynamic record name String>": { 
      "value": { 
      .... 
      } 
     } 
}  

그래서 동적 레코드 이름 문자열은 "ABCD", "XYZ"또는 다른 문자열 값이 될 수 - 나는 자바 POJO에 대한 키 이름과 같은 문자열 값을 사용하고 싶습니다. 내 "레코드"POJO에 이와 같은 키를 정의하려면 어떻게해야합니까?

+0

사전/HashMap에 매핑/매핑 하시겠습니까? 사용자 지정 직렬화를 사용 하시겠습니까? POJO 필드 자체는 고정 된 이름 *입니다. – user2864740

+0

지도 접근법을 좀 더 설명 할 수 있습니까? 맵 필드의 속성 이름을 사용하여 직렬화하지 않습니까? 나는 주로 잭슨 주석과 함께 POJO를 사용하고 있기 때문에 커스텀 시리얼 라이저를 원하지 않는다. 그래서이 경우에는 필자가 필요하다면 원치 않는다. –

답변

2

불행하게도, 당신은 (다른 언어와는 달리) 자바 클래스에서 동적 필드를 가질 수 없습니다, 그래서 당신은 두 가지 선택이 있습니다 경우 (즉, JsonNode를 JSON 객체를 사용 Map

  • 를 사용

    1. : 잭슨)

    가정이 같은 데이터를

    User.java :

    public class User { 
        private String name; 
        private Long rep; 
    
        public String getName() { return name; } 
    
        public void setName(String name) { this.name = name; } 
    
        public Long getRep() { return rep; } 
    
        public void setRep(Long rep) { this.rep = rep; } 
    
        @Override 
        public String toString() { 
         return "User{" + 
           "name='" + name + '\'' + 
           ", rep=" + rep + 
           '}'; 
        } 
    } 
    

    Data.java :

    public class Data { 
        private Map<String, User> record; 
    
        public Map<String, User> getRecord() { return record; } 
    
        public void setRecord(Map<String, User> record) { this.record = record; } 
    
        @Override 
        public String toString() { 
         return "Data{" + 
           "record=" + record + 
           '}'; 
        } 
    } 
    
    709,993,210

    을 캡처하는 두 개의 클래스, 객체 자체에 대한 사용자, 다른 하나 만들기

    이제 JSON을 구문 분석합니다 (클래스 경로의 루트에 data.json 파일이 있다고 가정).

    public class App { 
        public static void main(String[] args) throws Exception { 
         final ObjectMapper objectMapper = new ObjectMapper(); 
    
         System.out.println(objectMapper.readValue(App.class.getResourceAsStream("/data.json"), Data.class)); 
         System.out.println(objectMapper.readTree(App.class.getResourceAsStream("/data.json"))); 
        } 
    } 
    

    이 출력됩니다 :

    Data{record={jon-skeet=User{name='Jon Skeet', rep=982706}, darin-dimitrov=User{name='Darin Dimitrov', rep=762173}, novice-user=User{name='Novice User', rep=766}}} 
    {"record":{"jon-skeet":{"name":"Jon Skeet","rep":982706},"darin-dimitrov":{"name":"Darin Dimitrov","rep":762173},"novice-user":{"name":"Novice User","rep":766}}} 
    

    Map의 경우이 경우 User과 같은 몇 가지 정적 클래스를 사용하거나 Map의 (Map<String, Map<String, ...>>Map의를 사용하여 완전히 동적 갈 수 있습니다. 그러나 너무 많은지도를 사용하는 경우 JsonNode으로 전환하는 것이 좋습니다. 기본적으로 이들은 Map과 동일하며 매우 동적 인 데이터를 위해 특별히 고안되었습니다. 하지만 나중에 함께 일하는 데 어려움을 겪을 것입니다 ...

    전체 예제를 살펴보면 here을 준비했습니다.

  • +1

    굉장하다! 정말 고맙습니다 ! –