nat*_*tiz 8 java json jaxb jersey
我正在使用Jersey(1.9.1)并将JAXB用于我的对象,并尝试添加一个简单的JSON对象字段,理想情况下是Jackson的JsonNode类型,但我也可以使用jettison的JSONObject(甚至是GSON的JsonObject)/JsonElement)
原因是因为我想允许发送'自由格式'json(作为我们示例中的obj元素),以及同一对象上的其他元素(使用JAXB注释)
我的目标:
import org.codehaus.jettison.json.JSONObject;
@XmlRootElement(name="moo")
@XmlAccessorType(XmlAccessType.FIELD)
public class Moo {
@XmlElement
JSONObject obj;
...
}
Run Code Online (Sandbox Code Playgroud)
我的资源:
@Path("/moo")
@POST
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public Response postMsg(Moo e) {
System.out.println(e);
return Response.status(200).entity(e).build();
}
Run Code Online (Sandbox Code Playgroud)
有效载荷:
{"obj": {"my": "custom", "object": 1, "here": [1, 2, 3] } }
Run Code Online (Sandbox Code Playgroud)
使用上述执行POST请求时 - obj是空的JSONObject.同样的事情发生了,当我试着用杰克逊JsonNode和GSON的JsonElement/ JsonObject.
但是,当我JSONObject用作方法的arg时,它能够解析它
@Path("/moo")
@POST
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public Response postMsg(JSONObject e) {
System.out.println(e);
return Response.status(200).entity(e).build();
}
Run Code Online (Sandbox Code Playgroud)
我认为这是因为Jersey使用自己com.sun.jersey.json.impl.provider.entity.JSONObjectProvider的编组,而JAXB使用自己的marshller.
有没有办法解决这个问题,同时仍然使用JAXB的注释(对于其他领域)?我尝试XmlAdapter使用自定义(使用@XmlJavaTypeAdapter注释)而没有任何成功(因为我得到的对象ValueType是一个DOM元素)
我的最终目标是将该领域obj作为杰克逊代表(JsonNode).
任何方向将非常感谢.
如果我没猜错的话,你想嵌入一个原始 json 来获取自由值。
@XmlRootElement(name="moo")
@XmlAccessorType(XmlAccessType.FIELD)
public class Moo {
Object json;
@JsonRawValue
public String getJson() {
// default raw value: null or "[]"
return json == null ? null : json.toString();
}
public void setJson(JsonNode node) {
this.json = node;
}
}
Run Code Online (Sandbox Code Playgroud)
取自这里。
| 归档时间: |
|
| 查看次数: |
1307 次 |
| 最近记录: |