我有一个在多个应用程序之间共享的couchbase数据库,将文档存储为json。我似乎无法将数据存入我的java应用程序,因为它似乎依赖于本机java二进制序列化。
此代码:
CouchbaseClient client = new CouchbaseClient(hosts,"bucket","");
System.out.println((String)client.get("someKey"));
结果
net.spy.memcached.transcoders.SerializingTranscoder: Failed to decompress data
java.util.zip.ZipException: Not in GZIP format
因为默认情况下它正在尝试反序列化。我注意到我可以提供自己的代码转换器,但我真的只想要原始的字符串数据,所以我可以使用gson或其他任何东西自己解析它。没有一个可用的代码转换器似乎给了我这个。
couchbase文档有一个设置json的示例,但没有用于读取它。人们如何将json读入java?
答案 0 :(得分:3)
首先,这个问题很快就会消失,因为Couchbase“2.0 SDK”在彼此之间实现了共同的标志,所以这种问题不会出现。如果你想看看这里发生了什么,Michael's blogs是一个很好的阅读。首先出现问题的原因是,在1.x系列中,Couchbase试图保持与现有应用程序代码和memcached的兼容性。在memcached世界中,客户都是在不同时间由不同的人编写的。
基于异常,我相信您可能正在尝试读取.NET存储的项目。我有一个sample transcoder你可以在几个星期前使用它。
答案 1 :(得分:1)
确保您使用的是最新的CB java客户端:
<dependencies>
<dependency>
<groupId>com.couchbase.client</groupId>
<artifactId>couchbase-client</artifactId>
<version>1.4.4</version>
</dependency>
</dependencies>
请参阅:Couchbase Java Client Library 1.4
我的服务使用CB客户端运行得很好。以下是我创建客户端的方法:
CouchbaseConnectionFactoryBuilder cfb = new CouchbaseConnectionFactoryBuilder();
cfb.setOpTimeout(10000);
cfb.setOpQueueMaxBlockTime(5000);
CouchbaseClient client = new CouchbaseClient(cfb.buildCouchbaseConnection(baseURIs, bucketName, ""));
以下是我获取原始字符串并将其转换为POJO的示例:
MyPOJO get(CouchbaseClient client, String key)
{
com.google.gson.Gson gson = new com.google.gson.Gson();
String jsonValue = (String) client.get(key);
return gson.fromJson(jsonValue, MyPOJO.class);
}
此外,使用导致此问题的示例JSON文档更新您的问题。也许它与文档本身的格式有关。