我想将一个非常复杂的java对象保存为redis作为值。因此,我试图将此对象转换为Json(gson lib),但它不能用于我的目的(参见其他问题:GSON java.lang.IllegalArgumentException: class 'xx' declares multiple JSON fields named 'XX' AND StackOverflowError)。
我希望将存储/序列化这个应用程序的复杂java对象重命名为redis作为值并稍后加载回复杂的java对象(包含以下注释:Can Jedis get/set an Java POJO?) 。它仅用于评估目的。
如何将这个复杂的对象(最好用json转换)存储到redis和back?每条评论都会有所帮助
Update1:json和back的转换正在运行,但是在应用程序中进一步处理系统正在提升java.util.LinkedHashMap incompatible with XXX
。
SuperclassExclusionStrategy ex = new SuperclassExclusionStrategy();
Gson gson = new GsonBuilder().addDeserializationExclusionStrategy(ex).addSerializationExclusionStrategy(ex).create();
String json = gson.toJson(daoResult);
daoResultJson = gson.fromJson(json, JavaObject_DAOListResult.class);
子类中有一些对象尚未以原始状态转换回来。
解决
我已经解决了使用另一个名为json-io
的库的问题现在我可以与我的对象完美搭配。在Gson中,json字符串中缺少很多null属性。使用json-io,null属性也被转换。这是解决方案:
// convert daoResult to JSON
jsonIO = JsonWriter.objectToJson(daoResult);
// convert stored JSON to daoResult
daoResultJson = (DAOListResult) JsonReader.jsonToJava(jsonIO);
答案 0 :(得分:0)
假设您修复了将对象转换为JSON的其他问题(与此问题分开),我想,您可以将JSON字符串设置为Redis密钥,然后稍后再将其恢复:
127.0.0.1:6379> SET blah '{"some": "x", "some_other": "y"}'
OK
127.0.0.1:6379> GET blah
"{\"some\": \"x\", \"some_other\": \"y\"}"
您需要在Java对象和JSON之间构建一个序列化器/反序列化器,但这就是您需要对Redis进行的所有操作。您也可以使用带有HSET
和HGET
的Redis哈希来完成同样的操作,但是您没有在问题中提供足够的信息,以便我能够推荐哪种更适合您的情况