将Java Object保存为Redis作为值

时间:2014-07-20 12:52:05

标签: java json object redis gson

我想将一个非常复杂的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);

1 个答案:

答案 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进行的所有操作。您也可以使用带有HSETHGET的Redis哈希来完成同样的操作,但是您没有在问题中提供足够的信息,以便我能够推荐哪种更适合您的情况