JSON insert get 自动编码成base64
JSON insert get automatically encoded into base64
我有一个 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\naG9sZHhwP0AAAAAAAAx3CAAAABAAABnZhbHVlMXQABGtleTJ0AAZ2YWx1ZTJ0\nAANrZXl0AAV2YWx1ZXg="'
我想插入一个字符串而不是这个。
我在 S.O 上看到了一些帖子,但我没有找到任何正确的方法来修复它。任何帮助,将不胜感激。
谢谢!
JavaMysql驱动不支持Hashmaps的自动转换。事实上,如果您在 setObject
中使用未知类型,它将使用默认的 Java 序列化将其转换为它可以处理的类型。数据库接收一个包含序列化 HashMap 的字节数组。 cast(? as JSON)
将其转换为可以存储在列中的内容,即 BASE64 编码的字节数组。
您需要在 Java 代码中将 HashMap 转换为 JSON String,然后再将其发送到数据库。
您不能直接将 Java 对象写入 MySQL - 您需要先将映射转换为 JSON 字符串,然后再将其写入 table 列。
根据官方 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(k,v) => d(k), e(v)
我有一个 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\naG9sZHhwP0AAAAAAAAx3CAAAABAAABnZhbHVlMXQABGtleTJ0AAZ2YWx1ZTJ0\nAANrZXl0AAV2YWx1ZXg="'
我想插入一个字符串而不是这个。 我在 S.O 上看到了一些帖子,但我没有找到任何正确的方法来修复它。任何帮助,将不胜感激。 谢谢!
JavaMysql驱动不支持Hashmaps的自动转换。事实上,如果您在 setObject
中使用未知类型,它将使用默认的 Java 序列化将其转换为它可以处理的类型。数据库接收一个包含序列化 HashMap 的字节数组。 cast(? as JSON)
将其转换为可以存储在列中的内容,即 BASE64 编码的字节数组。
您需要在 Java 代码中将 HashMap 转换为 JSON String,然后再将其发送到数据库。
您不能直接将 Java 对象写入 MySQL - 您需要先将映射转换为 JSON 字符串,然后再将其写入 table 列。 根据官方 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(k,v) => d(k), e(v)