是否可以使用Moxy将JSON对象映射到字符串?

时间:2016-06-21 22:27:38

标签: java jaxb jersey moxy

假设我有一个数据模型,如:

public class MyModel {
    private String someString;
    private String someJson; // Data structure owned by client, persisted as a CLOB
}

我通过REST API(Jersey)向客户提供模型。我知道我可以将其整理/解组,例如:

{
    "someStrong": "foo",
    "someJson": "{ someClientThing: \"bar\", someOtherClientThing: \"baz\"}"
}

但我正在寻找更清洁的东西。有没有一种方法可以像JCC那样整理/解组JSON?

{
    someStrong: "foo",
    someJson: {
        someClientThing: "bar",
        someOtherClientThing: "baz"
    }
}

我不希望服务器必须知道someJson的数据模型,因为它由客户端拥有。我只是希望服务器处理它的持久性 - 所以服务器会在客户端和数据库之间来回传递它。

注意:它不需要直接映射到字符串 - 只要它可以映射到非结构化的(在服务器上没有静态定义),可以在持久化之前进行字符串化(并且在检索时将其解析为非结构化对象。

3 个答案:

答案 0 :(得分:2)

如果json没有数组,可能就像你的例子一样:

{ "someClientThing": "bar", "someOtherClientThing": "baz"}

对于这种简单的情况,解决方案是在自己的DomHandler中实现双向转换json-string< - > org.w3c.dom.Document实例。 将处理程序附加到字段:

@XmlRootElement
@XmlAccessorType(FIELD)
    public class MyModel {
    private String someString;
    @XmlAnyElement(value = SomeJsonHandler.class)
    private String someJson; // Data structure owned by client, persisted as a CLOB
}

享受。

不幸的是,数组存在很大问题,因为XML Dom不支持它们。在json之后重新转换

{ "someClientThing": "bar", "someOtherClientThing": ["baz1","baz2"]}
你会得到这样的东西

{
   "someClientThing": "bar",
   "someOtherClientThing": {value="baz1"},
   "someOtherClientThing": {value="baz2"}
}

答案 1 :(得分:1)

试试这样,也许可以帮到你

public class MyModel {
    private String someString;
    private Map<String, Object> someJson;
}

答案 2 :(得分:-1)

上述解决方案很简单。 而不是使someJson的数据类型为String。 您可以使用包含其中数据成员的用户定义数据类型。

public class MyModel {
private String someString;
private SomeJson someJson; 
}

public class SomeJson {
private String someClientThing;
private String someOtherClientThing; // Data structure owned by client, persisted as a CLOB
}

以上解决方案将为您提供帮助。