【问题标题】:Couchbase: How to create JsonObject from a java ObjectCouchbase:如何从 java 对象创建 JsonObject
【发布时间】:2015-03-02 10:09:54
【问题描述】:

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

我尝试过这样做:

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)

【问题讨论】:

    标签: java json couchbase


    【解决方案1】:

    Couchbase 中的 JsonObject 是用于处理 JSON 的非常基本的 API,接近于 Mapput 对其的简单值,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 中使用它!

    【讨论】:

    • 在我使用的代码中:JsonObject node = JacksonTransformers.MAPPER.convertValue(test, JsonObject.class);而不是:JsonObject node = mapper.convertValue(test, JsonObject.class);它奏效了。但 Long 不能以这种方式工作......我得到:-621171454 而不是 1425307970818
    • 啊,所以这个技巧并没有那么好用,嗯……但它并不是真正的预期用途。编辑我的答案
    【解决方案2】:

    我在 Java 2.x Couchbase 客户端之上创建了一个非常简单的库,它允许同步执行 CRUD 操作,也可以异步执行(通过 RxJava)。

    它展示了如何使用 Jackson 序列化/反序列化存储在 Couchbase 上的 bean。

    GitHub 上的项目: https://github.com/jloisel/reactive-couchbase

    【讨论】:

      猜你喜欢
      • 2014-07-12
      • 1970-01-01
      • 2015-11-13
      • 2017-07-11
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 1970-01-01
      相关资源
      最近更新 更多