Couchbase: 如何从Java对象创建JsonObject

4

如何轻松地将Java对象转换/解析为一个实例com.couchbase.client.java.document.json.JsonObject的JSON对象?

我尝试了以下代码:

import com.couchbase.client.deps.com.fasterxml.jackson.annotation.JsonProperty;

public class MyClass {

@JsonProperty("filed")
private String filed;

public MyClass(String filed) {
    this.filed = filed;
}

public String getFiled() {
    return filed;
}

并运行带导入的这些行:

    import com.couchbase.client.deps.com.fasterxml.jackson.databind.ObjectMapper;
    import com.couchbase.client.java.document.json.JsonObject;

    ObjectMapper mapper = new ObjectMapper();
    MyClass test = new MyClass("a");
    JsonObject node = mapper.convertValue(test, JsonObject.class);

然后我得到:

    java.lang.IllegalArgumentException: Unrecognized field "filed" (class com.couchbase.client.java.document.json.JsonObject), not marked as ignorable (one known property: "names"])
     at [Source: N/A; line: -1, column: -1] (through reference chain: com.couchbase.client.java.document.json.JsonObject["filed"])
at com.couchbase.client.deps.com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:2759)
at com.couchbase.client.deps.com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:2685)
2个回答

6
在Couchbase中,JsonObject旨在作为一种非常基本的API来处理JSON,类似于Map:您可以将简单的值放入其中,从中获取getStringgetInt等等。
请注意,JsonObject只接受有限的一组类型: null、String、Integer、Long、Double、Boolean、JsonObject或JsonArray。
如果您想存储领域对象,目前最好的支持方式是将它们编组为JSON字符串(使用您喜欢的Jackson、GSon等)并使用RawJsonDocument存储和检索它们。
以下是从数据库获取JSON字符串的示例:
RawJsonDocument doc = bucket.get("myKey", RawJsonDocument.class);
String jsonValue = doc.content();
MyClass value = unmarshalToMyClass(jsonValue); //this calls eg. Jackson

编辑:以下的技巧效果不是很好(例如处理长整型时会出现问题)
但是这里有个技巧可以实现你想要的功能:有一个预配置的Jackson ObjectMapper,你可以在JacksonTransformers.MAPPER中使用它!


1
在我的代码中,我使用了以下语句:JsonObject node = JacksonTransformers.MAPPER.convertValue(test, JsonObject.class); 而不是:JsonObject node = mapper.convertValue(test, JsonObject.class); 这样做是可以的。但是,Long类型不能这样转换... 我得到的结果是:-621171454,而不是1425307970818。 - Gil Matzov
啊,这个技巧效果不太好啊...但它本来也不是预期的使用方式。我要编辑我的回答。 - Simon Baslé

0
我在Java 2.x Couchbase客户端的基础上制作了一个非常简单的库,可以同步和异步(通过RxJava)执行CRUD操作。
它展示了如何使用Jackson对存储在Couchbase上的bean进行序列化/反序列化。
GitHub上的项目链接: https://github.com/jloisel/reactive-couchbase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接