Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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 JSONParsaging:UTF-8编码:JsonParseException:非法的无引号字符_Java_Json_Utf 8_Resttemplate_Control Characters - Fatal编程技术网

Java JSONParsaging:UTF-8编码:JsonParseException:非法的无引号字符

Java JSONParsaging:UTF-8编码:JsonParseException:非法的无引号字符,java,json,utf-8,resttemplate,control-characters,Java,Json,Utf 8,Resttemplate,Control Characters,我试图解析一个json,它是通过restemplate从rest服务获得的 当我试图解析包含 新线 或 制表符 它正在引发以下异常: org.codehaus.jackson.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 13)): has to be escaped using backslash to be included in string value at [Source: java.io.String

我试图解析一个json,它是通过
restemplate
从rest服务获得的

当我试图解析包含

新线

制表符

它正在引发以下异常:

org.codehaus.jackson.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 13)): has to be escaped using backslash to be included in string value
at [Source: java.io.StringReader@a8f373; line: 1, column: 663]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1433)
at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:521)
at org.codehaus.jackson.impl.JsonParserMinimalBase._throwUnquotedSpace(JsonParserMinimalBase.java:482)
at org.codehaus.jackson.impl.ReaderBasedParser._skipString(ReaderBasedParser.java:1416)
at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(ReaderBasedParser.java:366)
at com.demo.myapp.JsonParsingUtil.parseJson(JsonParsingUtil.java:67)  at java.lang.Thread.run(Thread.java:745)
代码在我的本地服务器上运行良好。[Windows操作系统,Jboss服务器]

当我在[Linux操作系统、Jboss服务器中部署代码时,会弹出此解析异常

问题是

  • 用户在windows环境中通过webapp输入一些数据
  • 我通过rest服务访问数据
  • 数据被解析以检索一些信息和用这些信息创建的新json,并传递给其他团队
我正在使用JsonParser来解析json,并将特性设置为

    JsonFactory jsonFactory = new MappingJsonFactory();
    JsonParser jsonParser = jsonFactory.createJsonParser(jsonString);
    jsonParser.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true);
    jsonParser.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);    
我也试过了

byte[] byteArray = jsonData.getBody().getBytes(); 
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(byteArray.length); 
byteArrayOutputStream.write(byteArray, 0, byteArray.length); 
jsonString = new String(byteArray, Charset.forName("UTF-8"));
而且

我在RestTemplate对象中设置了UTF-8编码,用于从rest服务获取json

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
因为我的json包含大量的
{key:values}
,所以使用
JsonGenerator
是不可行的选择。我希望有人能给我指出解决这个问题的正确方向

请查找我使用的代码:

        JsonFactory jsonFactory = new MappingJsonFactory();
        JsonParser jsonParser = jsonFactory.createJsonParser(jsonString);
        jsonParser.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true);
        jsonParser.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
        while (!jsonParser.isClosed()) {
            JsonToken jsonToken = jsonParser.nextToken();
            if (JsonToken.FIELD_NAME.equals(jsonToken)) {
                String fieldName = jsonParser.getCurrentName();
                if (fieldName.equals("Comments")) {
                    String code = jsonParser.nextTextValue();
                }
            }
        }
jsonString
从rest模板中获取

{"Comments":"Approved.
            Please proceed"}
那是

批准。换行字符,请继续


注意:我正在使用codehaus jackson-1.9.13库进行json解析

并没有回答您的实际问题,但您可能希望将jackson升级到更新的版本。它已经有一段时间没有出现在codehaus上了。另外,您可能想分享一个负载解析失败的最小示例。@Mena我已经用代码和示例输入更新了我的问题。我的经理可能会反对换到其他杰克逊图书馆。但是所有的输入都是受欢迎的:)您的JSON负载看起来是无效的。要使用换行符或换行符,您可以转义该值,例如使用
%0A
\n
等。我已尝试将所有“\\r\\n”替换为“\n”,但似乎不起作用。json也是来自第三方的,我收到的是上面给出的。