JSON вставка автоматически кодируется в base64 - PullRequest
1 голос
/ 26 февраля 2020

У меня есть JSON объект, который я вставляю в мою MySQL DB.

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 = " '

Я хотел бы вставить строку вместо этого. Я видел некоторые сообщения на SO, но я не нашел подходящего способа исправить это. Любая помощь будет оценена. Спасибо!

Ответы [ 2 ]

1 голос
/ 03 марта 2020

Вы не можете напрямую записать 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(k,v) => d(k), e(v)

1 голос
/ 03 марта 2020

Драйвер Java Mysql не поддерживает автоматическое c преобразование хэш-карт. Фактически, если вы используете неизвестный тип в setObject, он будет использовать сериализацию по умолчанию Java, чтобы преобразовать его во что-то, что он может обработать. База данных получает байтовый массив, содержащий сериализованный HashMap. cast(? as JSON) преобразует это во что-то, что может быть сохранено в столбце, который является байтовым массивом в кодировке BASE64.

Вам необходимо преобразовать ваш HashMap в JSON String в вашем Java код перед отправкой в ​​базу данных.

...