2016-10-11 2 views
1

간단한 문제 일 것이라고 생각했습니다.개체 목록 (Java, JSON/Jackson)이 포함 된 개체를 JSON 마샬링/언 마샬링

"SimplePerson"개체 목록이 포함 된 "Persons"클래스는 간단한 구조입니다. Persons.java은 다음과 같습니다

package jsontests; 

import java.util.ArrayList; 
import java.util.List; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonRootName; 

@JsonRootName (value="persons") 
    public class Persons { 

    @JsonProperty("person") 
    private List< SimplePerson> l; 

    public Persons(List<SimplePerson> pl) { 
     this.l = pl; 
    } 

    public Persons() { 
     this.l = new ArrayList<>(); 
    } 

    public List<SimplePerson> getL() { 
     return this.l; 
    } 

    public void setL(List<SimplePerson> l) { 
     this.l = l; 
    } 
} 

그리고 "SimplePerson.java"는 다음과 같습니다

package jsontests; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 
import com.fasterxml.jackson.databind.SerializationFeature; 

public class JsonListTest { 

    public static void main(String[] args) { 
     JsonListTest var = new JsonListTest(); 
     var.run(); 
    } 

    private void run() { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.enable(SerializationFeature.INDENT_OUTPUT); 
     mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true); 
     Persons cl = new Persons(); 

     SimplePerson first = new SimplePerson(); 
     first.setName("Schmidt"); 
     first.setFirstname("Peter"); 
     cl.getL().add(first); 
     SimplePerson second = new SimplePerson(); 
     second.setName("Smith"); 
     second.setFirstname("George"); 

     cl.getL().add(second); 

     String s = null; 
     try { 
      s = mapper.writeValueAsString(cl); 
     } catch (JsonProcessingException e) { 
      e.printStackTrace(); 
     } 
     System.out.println(s); 
    } 
} 
:
package jsontests; 
import com.fasterxml.jackson.annotation.JsonRootName; 

@JsonRootName (value="person") 
public class SimplePerson { 

    String name; 
    String firstname; 


    /** 
    * @return the name 
    */ 
    public String getName() { 
    return name; 
    } 

    /** 
    * @param name the name to set 
    */ 
    public void setName(String name) { 
     this.name = name; 
    } 

    /** 
    * @return the firstname 
    */ 
    public String getFirstname() { 
     return firstname; 
    } 

    /** 
    * @param firstname the firstname to set 
    */ 
    public void setFirstname(String firstname) { 
     this.firstname = firstname; 
    } 
} 

내가 그 개체와 마샬을 만들려면이 코드 조각을 사용

결과는 예상대로 :

{ 
"persons" : { 
    "person" : [ { 
    "name" : "Schmidt", 
    "firstname" : "Peter" 
    }, { 
    "name" : "Smith", 
    "firstname" : "George" 
    } ] 
    } 
} 

내 마음에 그것은 "우리는 사람이라고 불리는 물건을 가진 사람이라고 불리는 물건이 있습니다. 이 person-object에는 이름/이름 쌍으로 이루어진 객체의 배열이 들어 있습니다. "이 모든 것이 완전히 나와 맞습니다. 코드는 정확히 무엇입니까

불행히도 costumer에서받은 것은 약간 다릅니다.

{ 
    "persons": [ 
    { 
     "person": { 
      "name" : "Schmidt", 
      "firstname": "Peter" 
     } 
    },{ 
     "person": { 
      "name" : "Smith", 
      "firstname": "George" 
     } 
    } 
    ] 
} 

제 생각에는 이것은 약간 다른 것을 읽습니다. "우리는 사람이라고 불리는 객체를 가지고 있으며 여기에는 배열이 포함되어 있습니다. 이 배열의 첫 번째와 두 번째 요소는 person이라는 객체이며 이름/이름 쌍으로 구성됩니다.

동일하지만 다르지만 :-) 내가 입력 한 내용을 사용하는 방법을 찾기 위해 하루를 보냈습니다. 성공하지 못했습니다. 클래스 구조를 변경하는 데는 아무런 문제가 없습니다. 다른 JSON을 제공하도록 costumer를 설득 할 수있는 아주 작은 기회가 있습니다.

아이디어가 있으십니까? 감사!

+1

json 데이터가 있으면 pojo를 매우 쉽게 만들 수 있습니다. -http : //www.jsonschema2pojo.org/ –

+0

Persons 개체에서 루트 이름을 제거하고 목록 이름을 "persons"로 변경 한 다음 alwaysWrap을 true로 설정합니다 SimplePerson의 루트 이름 주석에서 마침내 랩퍼 루트 값 기능을 사용하지 않도록 설정하십시오. 이렇게하면 다음과 같이 말할 수 있습니다. "강력하게 형식이 지정된" "사람"(유형?) 개체가 포함 된 "인물"이라는 컬렉션 유형 속성을 가진 개체 ... " – Zsolt

+1

@Derick - 덕분에 많이 - 정말 도움이되었습니다. . – Ishiido

답변

-1

필자는 Derick (첫 번째 의견 참조)의 제안에 따라 필요한 데이터 모델을 생성했습니다. 이것은 최상의 해결책으로 보였다.

+0

귀하의 답변으로 귀하의 질문에 답변하지 못했습니다. 나는 똑같은 문제를 겪고 있지만 문제를 해결하기 위해 어떻게 대답을 사용할 수 있는지 이해하지 못합니다. Dericks가 도움을 주었던 이유와 그것이 작동하도록하기 위해 코드를 변경 한 이유를 설명해주십시오. –

+0

지체히해서 죄송합니다. 그것은 아주 오래 전에 ... 지금까지 내가 기억하는 한, 필자는받은 형식을 취하여 필요한 POJO를 생성했다 (POJO를 작성하는 대신 예상되는 방식으로 처리 할 예정). – Ishiido

관련 문제