2016-06-17 22 views
5

ObjectMapper kullanarak kök öğesinde ek açıklama olarak SerializationFeature.WRAP_ROOT_VALUE yapılandırmasının olması için bir yol var mı? ÖrneğinSerializationFeature.WRAP_ROOT_VALUE ek açıklama olarak jackson json

Ben:

@JsonRootName(value = "user") 
public class UserWithRoot { 
    public int id; 
    public String name; 
} 

ObjectMapper kullanma: Sonuç

@Test 
public void whenSerializingUsingJsonRootName_thenCorrect() 
    throws JsonProcessingException { 
    UserWithRoot user = new User(1, "John"); 

    ObjectMapper mapper = new ObjectMapper(); 
    mapper.enable(SerializationFeature.WRAP_ROOT_VALUE); 
    String result = mapper.writeValueAsString(user); 

    assertThat(result, containsString("John")); 
    assertThat(result, containsString("user")); 
} 

:
{ 
    "user":{ 
     "id":1, 
     "name":"John" 
    } 
} 

bu bir ek açıklama olarak SerializationFeature ile olmayanlar için bir yol var mıüzerinde bir yapılandırma olarak?

kullanma bağımlılık:

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-databind</artifactId> 
    <version>2.7.2</version> 
</dependency> 
+0

Belki bu: http://stackoverflow.com/a/31158706/829571 Ayrıca bakınız: https://github.com/FasterXML/jackson-annotations/issues/33 – assylias

+0

@ assylias evet cevabı da gördü. Ama daha düşük deve davası olarak nasıl anlayacağımı bilmiyorum. "Kullanıcı" ve "Kullanıcı" değil. Bunun mümkün olup olmadığından emin değilsiniz – Patrick

cevap

6
import com.fasterxml.jackson.annotation.JsonTypeInfo; 
import com.fasterxml.jackson.annotation.JsonTypeName; 
import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 

public class Test2 { 
    public static void main(String[] args) throws JsonProcessingException { 
     UserWithRoot user = new UserWithRoot(1, "John"); 

     ObjectMapper objectMapper = new ObjectMapper(); 

     String userJson = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(user); 

     System.out.println(userJson); 
    } 

    @JsonTypeName(value = "user") 
    @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) 
    private static class UserWithRoot { 
     public int id; 
     public String name; 
    } 
} 

@JsonTypeName ve @JsonTypeInfo birlikte mümkün kılar.

Sonuç:

{ 
    "user" : { 
    "id" : 1, 
    "name" : "John" 
    } 
} 
+1

Bunun için teşekkür ederim, bir yanıtı sarmanın ne kadar karmaşık olduğuna inanamıyorum. – Sean

+2

@Sean - Çok doğru, karmaşık ve alışmak için zaman alıyor. Sarıcı adını alacak olan '@ JsonWrapper' veya '@ JsonRootValue' gibi bir şeyle gelmiş olabilirler. – Isank