我的json存储在postgres中是否已损坏?

时间:2016-08-24 15:45:19

标签: java postgresql utf-8 jackson

我实现了一个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();
    }

}

0 个答案:

没有答案