【问题标题】:How to store a JSON string as entity's attribute如何将 JSON 字符串存储为实体的属性
【发布时间】:2015-11-06 13:09:26
【问题描述】:

我正在使用 Spring MVC 制作游戏(尝试...),例如 Risk for university。我正在使用 JPA,我需要将游戏状态(玩家轮到,国家单位等)保存在一个用 JSON 编码的字符串字段中,这就是让我发疯的原因。 首先,我使用其他信息(id、用户所有者、状态...)创建游戏,当它第一次启动时,我想生成 JSON 并将其设置为实体并保存它。我尝试使用 entityManager.merge(game) 但是当我查看数据库时,JSON 字段为空。我试图制作 namedquery 和 nativequery,但在 JSON 字符串中有 " 它是一团糟。 有什么想法为什么不通过合并保存? 代码是这样的:

HomeController.class

public String getGame(@PathVariable("idGame") long idGame,
        Model model) throws IOException {           
        Game g = GameDao.getGame(idGame);
        if  (g.getJson == null) {
            g.initializeGame(); // it sets the json attribute
            GameDao.update(entityManager, g);
        }
}

GameDAO.class

@Transactional
public static Game update(EntityManager entityManager, Game g) {
    try {       
        entityManager.merge(g); // if I debug here g has the json attribute setted
        return entityManager.find(Game.class, g.getId()); // the game object that's returned hasn't the json field setted
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

这是 repo https://github.com/alvardsoler/reinvasion,但它是西班牙语中最多的。九月份的考试,我没有太多的时间,所以我想先把它做的很粗略,然后如果我有时间,我会做得很好。如果我无法将 JSON 信息保存在数据库中,我会将其保存在服务器中的一个文件中,其中包含游戏 ID 或类似的东西。

【问题讨论】:

  • 已经尝试过 GSON 库?我们在类似的情况下使用它并且效果很好:github.com/google/gson
  • @Phiwa 以什么方式?我用它来创建 JSON 字符串 Gson gson = new Gson(); this.json = gson.toJson(jp, JuegoPartida.class); (在 initializeGame() 中)。

标签: java json spring-mvc jpa


【解决方案1】:

使用库 GSON (jsonString) 相当容易:

// Create the JSON string like this first

MyObject yourObject = /* Create an object here */;
Gson gson = new Gson();
String jsonString = gson.toJson(yourObject);


// Create an object from the JSON string like this afterwards
MyObject newObject = gson.fromJson(jsonString , MyObject.class);

【讨论】:

  • 我就是这么做的。问题是当我想存储在数据库中时。 JSON 字符串很好,当我将它发送到客户端时,我可以使用 Javascript 等操作它。请参阅github.com/alvardsoler/reinvasion/blob/master/src/main/java/es/… 第 103 行
  • 哦,您的意思是字符串中的 " 和 ' 有问题?您可以在保存到数据库之前转义这些字符以避免这些问题。
  • 是的。我想这就是问题所在。我试过 string.replace("\"", "\\\"");但它不起作用......你的意思是用\”替换JSON字符串中的每个“,不是吗?
  • 您使用的是哪个数据库?
  • 如果你使用 PreparedStatement 你应该没有问题,但使用 \" 应该也可以,所以我有点困惑这会导致你的情况出现问题。
【解决方案2】:

我发现了问题。我使用 createNativeQuery 进行更新:

Query q = entityManager.createNativeQuery("update Game g SET   g.json=:json where g.id=:id");
q.setParameter("json", g.getJson());
q.setParameter("id", g.getId());
q.executeUpdate();

并在GameDAO的方法和HomeController方法中添加@Transactional...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-28
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多