2012-11-14 12 views
8

मैं जैक्सन 2.1.0 का उपयोग कर रहा हूं। यह देखते हुए:क्यों @ जेसन ने लिस्ट के लिए काम नहीं किया?

public static final class GetCompanies 
{ 
    private final List<URI> companies; 

    /** 
    * Creates a new GetCompanies. 
    * <p/> 
    * @param companies the list of available companies 
    * @throws NullPointerException if companies is null 
    */ 
    @JsonCreator 
    public GetCompanies(@JsonUnwrapped @NotNull List<URI> companies) 
    { 
     Preconditions.checkNotNull(companies, "companies"); 

     this.companies = ImmutableList.copyOf(companies); 
    } 

    /** 
    * @return the list of available companies 
    */ 
    @JsonUnwrapped 
    @SuppressWarnings("ReturnOfCollectionOrArrayField") 
    public List<URI> getCompanies() 
    { 
     return companies; 
    } 
} 

जब इनपुट सूची http://test.com/ होता है, जैक्सन उत्पन्न करता है:

{"companies":["http://test.com/"]} 

के बजाय:

["http://test.com/"] 

कोई भी विचार?

अद्यतन: संबंधित चर्चा के लिए https://github.com/FasterXML/jackson-core/issues/41 देखें।

उत्तर

16

इस मामले में, अगर यह काम करने के लिए था, तो आपको निम्न उत्पादन करने की कोशिश कर पहुंचते हैं:

{ "http://test.com" } 

जो कानूनी JSON नहीं है। @JsonUnwrapped वास्तव में सिर्फ लपेटने की एक परत को हटा देता है। और यद्यपि यह सैद्धांतिक रूप से "सरणी में सरणी" मामले के लिए काम करने के लिए बनाया जा सकता है, यह नहीं है। और वास्तव में मुझे आश्चर्य है कि इस सुविधा को जोड़ना एक गलती थी: अधिकांशतः क्योंकि यह डेटा को बाध्यकारी सर्वोत्तम प्रथाओं (सादगी, एक-से-एक मैपिंग) के खिलाफ अक्सर उपयोग करने के लिए प्रोत्साहित करता है।

लेकिन क्या बजाय काम करेगा @JsonValue है:

@JsonValue 
private final List<URI> companies; 

जिसका अर्थ है "इस संपत्ति के उपयोग मूल्य के बजाय उद्देश्य यह है कि इसमें serializing"।

और निर्माता विधि वास्तव में काम करेगी, @JsonUnwrapped या @JsonProperty के लिए कोई आवश्यकता नहीं है।

public static final class GetCompanies 
{ 
    private final List<URI> companies; 

    /** 
    * Creates a new GetCompanies. 
    * <p/> 
    * @param companies the list of available companies 
    * @throws NullPointerException if companies is null 
    */ 
    @JsonCreator 
    public GetCompanies(@NotNull List<URI> companies) 
    { 
     Preconditions.checkNotNull(companies, "companies"); 

     this.companies = ImmutableList.copyOf(companies); 
    } 

    /** 
    * @return the list of available companies 
    */ 
    @JsonValue 
    @SuppressWarnings("ReturnOfCollectionOrArrayField") 
    public List<URI> getCompanies() 
    { 
     return companies; 
    } 
} 
:

यहाँ को सही कोड है