JAXB/Jersey - JSONObject作为XmlElement

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).

任何方向将非常感谢.

ssc*_*ass 2

如果我没猜错的话,你想嵌入一个原始 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)

取自这里