【问题标题】:JSON insert get automatically encoded into base64JSON插入自动编码为base64
【发布时间】:2020-06-10 11:40:51
【问题描述】:

我有一个 JSON 对象,我插入到我的 MySQL 数据库中。

ps = con.prepareStatement("INSERT INTO tableA(a, b, c, d_json)" +
                    " VALUES(?,?,?,cast(? AS JSON))", Statement.RETURN_GENERATED_KEYS);
// some code
ps.setObject(4, jsonValue);

我插入一个字符串的哈希映射为:

    Map<String, String> map = new HashMap<String, String>();
    map.put("key", "value");
    map.put("key1", "value1");
    map.put("key2", "value2");

然而 json 被编码如下:

'"base64:type15:rO0ABXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKRvckkACXRocmVz\naG9sZHhwP0AAAAAAAAAx3CAAAABAAABnZhbHVlMXQABGtleTJ0AAZ2YWx1ZTJ0\nAANrZXl0AAV2YWx1ZXg>

我想插入一个字符串而不是这个。 我在 S.O 上看到了一些帖子,但我没有找到任何合适的方法来解决它。任何帮助,将不胜感激。 谢谢!

【问题讨论】:

  • 那么map 是你的json'Value 吗?您在帖子中显示的 base64 包含许多不可打印的字节,它不是 map 的 JSON 表示形式
  • 是的。事实上,我的问题是,即使我尝试使用在线工具对其进行解码,它也会返回一些没有任何意义的东西。
  • this 有帮助吗?
  • 没有那么多,因为我使用了 sql 方法:cast as json。实际上,我不想过多地转换我的数据,这就是为什么我只是使用哈希图而不是 JSON 对象。
  • 但这显然不起作用,我想知道 SQL 应该如何知道如何将 Java 对象转换为 JSON。

标签: java mysql json jdbc base64


【解决方案1】:

您不能直接将 Java 对象写入 MySQL - 您需要先将映射转换为 JSON 字符串,然后再将其写入表列。 根据官方docs 的说法:“如果值是有效的 JSON 值,则尝试将值插入 JSON 列成功,但如果不是,则失败”。

这是一个例子(杰克逊):

import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {

  private static final ObjectMapper objectMapper = new ObjectMapper();

  public static String toJSON(Map<String, String> map) throws JsonProcessingException {
    return objectMapper.writeValueAsString(map);
  }
}

另一种选择是创建一个额外的列 e,然后简单地将 map 写入两列:map(k,v) =&gt; d(k), e(v)

【讨论】:

    【解决方案2】:

    Java Mysql Driver 不支持 Hashmap 的自动转换。事实上,如果您在setObject 中使用未知类型,它将使用默认的 Java 序列化将其转换为可以处理的类型。数据库接收到一个包含序列化 HashMap 的字节数组。 cast(? as JSON) 将其转换为可以存储在列中的内容,即 BASE64 编码的字节数组。

    您需要先将您的 HashMap 转换为 Java 代码中的 JSON 字符串,然后再将其发送到数据库。

    【讨论】:

    • 非常感谢您回答并解释它为什么不起作用。我接受了 Piotr 的回答,但你的回答和他的一样好!
    猜你喜欢
    • 2018-06-11
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多