我实现了一个Java管道,它在postgres中存储了一些对象(9.5)。
首先使用jackson(2.5.4)将对象序列化为json字符串,然后使用JDBC以JSON列类型将其发送到DBMS。
当需要的对象从数据库中读取,反序列化并由应用程序使用时。
问题是,当我尝试用psql查询我的数据时,我有一些奇怪的错误,与UTF-8链接:
kronos=# select payload from messages where payload->>'errorMessage' = 'some error';
ERROR: unsupported Unicode escape sequence
DETAIL: \u0000 cannot be converted to text.
CONTEXT: JSON data, line 1:
...globalIdResolution":"GENERATED","authorFullName":...
我并不特别担心,因为我的应用程序可以写入和读取RDBMS中的所有数据。这是一个psql问题还是我做错了什么?有没有办法确保我的数据可以从任何应用程序访问,如果不是基于java + jackson,也可以访问?
我认为这不是杰克逊的错,因为我尝试了单元测试,但字符串似乎不包含\ 0000 char:
package it.celi.dd.kronos.json;
import static org.junit.Assert.*;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonUTF8Test {
@Test
public void test() throws JsonProcessingException {
final ObjectMapper objectMapper = new ObjectMapper();
final String utf8 = "؏ـــطــہ";
final Map<String, Object> map = new HashMap<>();
map.put("content", txt(1600) + utf8 + txt(500));
final String json = objectMapper.writeValueAsString(map);
final int jsonBoilerplate = "{\"content\":\"".length() + "\"}".length();
assertEquals(1600 + utf8.length() + 500 + jsonBoilerplate, json.length());
System.out.println(json.length());
assertEquals("{\"content\":\"" + txt(1600) + utf8 + txt(500) + "\"}", json);
}
private String txt(final int chars) {
final StringBuilder builder = new StringBuilder();
for(int i = 0; i < chars; i ++) {
builder.append('a');
}
return builder.toString();
}
}