2017-11-16 5 views
-2

다른 클래스에 JSON 일부 필드를 직렬화 :나는 아래 형식의 JSON이

{ 
    "id": 0, 
    "alternateId": 0, 
    "familyName": "", 
    "givenName": "", 
    "firstName":"", 
    "lastName": "", 
    "middleName": "", 
    "suffix": "",  
    "motherName": "", 
    "datOfBirth": "", 
    "sex": "", 
    "alias": [ 
     { 
     "firstName": "", 
     "lastName": "", 
     "middleName": "", 
     "suffix": "", 
     } 
    ] 
} 

당신이 관찰 할 수 있듯이을, 네 개의 필드 firstNamealias 필드에 존재하는 lastName, middleNamesuffix 부모 클래스의 필드로도 위에 있습니다.

public class Person 
{ 
    private int  id; 
    private int  alternateId; 
    private String familyName; 
    private String givenName; 
    private String firstName; 
    private String lastName; 
    private String middleName; 
    private String suffix; 
    private String motherName; 
    private Date datOfBirth; 
    private String sex; 
    private Set<Alias> alias; 
} 

public class Alias 
{ 
    private String firstName; 
    private String lastName; 
    private String middleName; 
    private String suffix; 
} 

그리고 잭슨 매퍼와의 작업 좋은 :

현재 나는 다음과 같은 클래스가 있습니다. 현재 JSON을 변경하지 않고

public class Person 
{ 
    private int  id; 
    private int  alternateId; 
    private String familyName; 
    private String givenName; 
    private Alias primaryAlias; 
    private String motherName; 
    private Date datOfBirth; 
    private String sex; 
    private Set<Alias> alias; 
} 

:하지만 내 질문은 Person 클래스에있는 필드는 필드 primaryAlias ​​및 클래스 새에 결합 될 수있다 줄일 수. 잭슨의 디시리얼라이저를 작성하기 위해 무언가를 수행하여 json의 firstName, , middleNamesuffix 필드를 새 변수 primaryAlias에로드 할 수 있습니까?

전체 코드가 필요하지는 않지만 수행해야 할 힌트가 충분합니다. 검색을 시도했지만 어쩌면이 문제를 설명하기위한 완벽한 용어가 누락되었습니다.

아마도 이미지로 더 잘 설명 할 수 있습니다. 현재 일어나고있는 무슨이다 :

enter image description here

을 그리고 이것은 내가 원하는 무엇인가 :

당신의 구출 enter image description here

+0

응답을 삭제했습니다. 그러나 JSON에서 'alias'는 목록이므로 자동으로 수행 할 수 없습니다 ... 아마도 JSOn을 반복하여 객체를 수동으로 만들 수 있습니다. – canillas

+0

@canillas 예. 내가 아는 한. 주석 및 맞춤형 디시리얼라이저를 사용하여 자동 잭슨 솔루션을 생각 중이었습니다. –

+0

대신 org.json을 사용하면 가능합니다. 이 라이브러리를 사용하면 클래스의 'getter'에서 JSON 표현을 만들 수 있습니다. 따라서 원하는 문자열을 반환하는 getPrimaryAlias ​​() 메서드를 만드는 경우 제대로 작동합니다. 다음은 그 예입니다 : https://stackoverflow.com/a/46826568/6370796 – Asew

답변

1

은, 그래서, 클래스의 생성 전에 제어를 제공 @JsonCreator을 제공하면 직접 속성을 채울 수 있습니다.

여기 내 빠른 작업이 있습니다 (방금 json의 제한된 속성을 사용했습니다). 마찬가지로 내 toString 메서드는 속성이로드 된 것을 반영합니다. 원하는 경우 의미있는 toString을 사용할 수 있습니다.

import com.fasterxml.jackson.annotation.JsonCreator; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.core.type.TypeReference; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import java.util.Map; 
import java.util.Set; 

public class JacksonTest { 

    final static ObjectMapper mapper = new ObjectMapper(); 

    public static void main(String[] args) throws Exception { 

     final String jsonInString = "{\n" 
       + " \"id\": 0,\n" 
       + " \"familyName\": \"someFN\",\n" 
       + " \"givenName\": \"someGivenName\",\n" 
       + " \"firstName\":\"firstNameInperson\",\n" 
       + " \"lastName\": \"\",\n" 
       + " \"middleName\": \"\",\n" 
       + " \"suffix\": \"\", \n" 
       + " \"motherName\": \"\",\n" 
       + " \"alias\": [\n" 
       + "  {\n" 
       + "  \"firstName\": \"firstNameInAlias\",\n" 
       + "  \"lastName\": \"\",\n" 
       + "  \"middleName\": \"\",\n" 
       + "  \"suffix\": \"\"\n" 
       + "  }\n" 
       + " ]\n" 
       + "}"; 
     //System.out.println(jsonInString); 

     Person person = mapper.readValue(jsonInString, Person.class); 
     System.out.println(person); 
     // System.out.println(newFoo.getSomething()); 
    } 
} 

class Person { 

    @JsonProperty 
    private int id; 

    @JsonProperty 
    private String familyName; 

    Alias alias; 

    @JsonProperty 
    private String motherName; 
    @JsonProperty 
    private Set<Alias> aliases; 

    @JsonCreator 
    public Person(final Map<String, Object> properties) { 
     System.out.println("printing in constructor.." + properties); 
     id = (Integer) properties.get("id"); 
     familyName = (String) properties.get("familyName"); 
     Alias al = new Alias(); 
     al.firstName = (String) properties.get("firstName"); 
     al.lastName = (String) properties.get("lastName"); 
     al.middleName = (String) properties.get("middleName"); 
     al.suffix = (String) properties.get("suffix"); 
     this.alias = al; 
     TypeReference aliasesType = new TypeReference<Set<Alias>>() { 
     }; 
     try { 
      aliases = JacksonTest.mapper.readValue(JacksonTest.mapper.writeValueAsString(properties.get("alias")), aliasesType); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public String toString() { 
     return "Person: familyName:" + familyName + ", Alias: " + alias + " Aliases:" + aliases; 
    } 

} 

class Alias { 

    @JsonProperty 
    String firstName; 

    @JsonProperty 
    String lastName; 

    @JsonProperty 
    String middleName; 

    @JsonProperty 
    String suffix; 

    public String toString() { 
     return "Alias : firstName::" + firstName; 
    } 
} 
+0

감사. 이것은 완벽 해. –