2016-02-29 53 views
1

我使用Jersey 2.22.1和MOXY作爲Json提供程序來實現RESTFul Web服務。JSON解組使用JAX-RS和MOXy

例如我有以下實體用戶:

public class User { 

    private String id; 
    private String email; 
    private Address address; 
    private List<Phone> phones; 

    // getters & setters 

} 

和其他類

public class Address { 

    private String type; 
    private String value; 

    // getters & setters 

} 

public class Phone { 

    private String type; 
    private String value; 

    // getters & setters 

} 

這是我的JAX-RS資源實現:

@POST 
public Response create(User user) { 
    // some logic 
} 

現在,當我m發送包含以下json數據的POST請求:

{ 
    "id":"qwe12", 
    "email":"[email protected]", 
    "address":{ 
     "type":"1WHEN-Honorable", 
     "value":"1WHEN-M" 
    }, 
    "phones":[ 
     { 
     "type":"HOME", 
     "number":"034-2342-12-31" 
     }, 
     { 
     "type":"WORK", 
     "number":"31-21-3211-32" 
     } 
    ] 
} 

它完美的作品,MOXY自動映射此JSON用戶對象和它的罰款

但我需要處理JSON築巢的另一個層面,是這樣的:

{ 
    "user":{ 
     "id":"qwe12", 
     "email":"[email protected]", 
     "address":{ 
     "type":"1WHEN-Honorable", 
     "value":"1WHEN-M" 
     }, 
     "phones":[ 
     { 
      "type":"HOME", 
      "number":"034-2342-12-31" 
     }, 
     { 
      "type":"WORK", 
      "number":"31-21-3211-32" 
     } 
     ] 
    } 
} 

,你可以看到另一個關鍵字叫做用戶,我知道這不是一個好的json結構,但這是一個需求,我必須接受它。現在我需要能夠處理它。現在我只能看到一個解決方案。

我可以添加另一個類包裝aroung用戶並將其傳遞給創建方法。

所以它看起來這樣:

JAX-RS資源:

@POST 
public Response create(UserWrapper user) { 
    // some logic 
} 

和Java類:

public class UserWrapper { 

    private User user; 

    // getters & setters 

} 

它的工作解決方案,但我真的不喜歡它,因爲我需要添加一個額外的類。想在這裏你的建議如何保持我的Java類,因爲它是,並能夠接受多層次的嵌套(我的意思是這個用戶密鑰)的JSON。

在此先感謝!

回答

0

可能不是您正在尋找的答案,但我建議使用Jackson而不是MOXy。這是一個更成熟的JSON框架,具有更多功能,並且效果更好。可能有莫西的一種方式,但這裏是傑克遜的方式

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>2.22.1</version> 
</dependency> 
<!-- You need to remember to remove MOXy --> 

ContextResolver,配置ObjectMapper解開根值

@Provider 
public class MyObjectMapperProvider implements ContextResolver<ObjectMapper> { 
    final ObjectMapper mapper; 

    public MyObjectMapperProvider() { 
     mapper = new ObjectMapper(); 
     mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); 
    } 

    @Override 
    public ObjectMapper getContext(Class<?> type) { 
      return defaultObjectMapper; 
     } 
    } 

    private static ObjectMapper createDefaultMapper() { 
     return mapper; 
    } 
} 

它會尋找反序列化的價值要麼是

  1. @JsonRootName註釋中的值,例如@JsonRootName("user")(課上)
  2. @XmlRootElement註釋中的值,例如,@XmlRootElment(name="user")(課上)
  3. 如果沒有註釋,那麼該類的名稱,第一個字母的下邊框。

也不是,除非您使用任何MOXy特定功能,切換到傑克遜,否則您可能不需要對您的類進行任何更改。傑克遜還支持JAXB註釋(大部分)。

如果你想被包的響應,你也可以使用

mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, true);