Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将列表序列化为json时出现异常_Java_Json - Fatal编程技术网

Java 将列表序列化为json时出现异常

Java 将列表序列化为json时出现异常,java,json,Java,Json,我无法将对象列表序列化为JSON(Jackson)。我的对象包含带有德语umlaute的字符串(例如ä,ö,ü,ß)。当我将包含这些对象的列表发送到服务器时,会得到一个JsonMappingException:无效的UTF-8中间字节。我100%认为问题出在客户端,因为当我通过邮递员发送JSON字符串时,它工作正常 public static ResponseEntity<?> exchange(String servicePath, HttpMethod method, Class

我无法将对象列表序列化为JSON(Jackson)。我的对象包含带有德语umlaute的字符串(例如ä,ö,ü,ß)。当我将包含这些对象的列表发送到服务器时,会得到一个JsonMappingException:无效的UTF-8中间字节。我100%认为问题出在客户端,因为当我通过邮递员发送JSON字符串时,它工作正常

public static ResponseEntity<?> exchange(String servicePath, HttpMethod method, Class returnClass, List<? extends BaseObject> objectList, Object... uriVariableValues) throws JsonProcessingException, UnsupportedEncodingException
{
    RestTemplate template = new RestTemplate();
    template.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
    template.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName("UTF-8")));

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);

    String url = ConfigHandler.getServicePath(servicePath);
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ConfigHandler.getStringProperty("baseUrl"));
    URI uri = builder.path(url).buildAndExpand(uriVariableValues).toUri();
    byte[] bytes = Utils.getJacksonObjectMapper().writeValueAsBytes(objectList);

    //String urlParameters = new String(Utils.getJacksonObjectMapper().writeValueAsString(objectList).getBytes("UTF-8"));
    String urlParameters = new String(bytes, "UTF-8");
    //urlParameters = urlParameters.replaceAll("ß", "HURZ");
    System.out.println("WebUtils.exchange - JSON: "+urlParameters);

    HttpEntity<String> entity = new HttpEntity<>(urlParameters, headers);

    return template.exchange(uri, method, entity, returnClass);
}

public static ObjectMapper getJacksonObjectMapper()
{
    ObjectMapper mapper = new ObjectMapper()
            .registerModule(new ParameterNamesModule())
            .registerModule(new Jdk8Module()).registerModule(new JavaTimeModule());
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

    return mapper;
}

publicstaticresponseentity交换(stringservicepath,HttpMethod方法,Class returnClass,List在客户端设置正确的编码:

updateRequest.setHeader("Content-Type", "application/json;charset=UTF-8");
StringEntity entity= new StringEntity(json, "UTF-8");
updateRequest.setEntity(entity);

如果将来有人偶然发现这个问题,解决方案是在HttpHeader中再添加一点:

HttpHeaders headers = new HttpHeaders();
MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
headers.setContentType(mediaType);
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8")));

我也是这么想的。我只是不知道如何使用Jackson实现这一点。可能需要对url参数进行编码:我使用的是Spring类,我更愿意使用Spring。因此没有StringEntity