简体   繁体   English

com.fasterxml.jackson.core.JsonParseException:意外的字符('\\'(代码92))[Java]

[英]com.fasterxml.jackson.core.JsonParseException: Unexpected character ('\' (code 92)) [Java]

I am deeply sorry for this messy title, but I am completly lost on why this can happen. 我对这个混乱的标题深感抱歉,但我完全不知道为什么会发生这种情况。

I am trying to parse a JSON String using Jackson. 我正在尝试使用Jackson解析JSON字符串。 My code is simple: 我的代码很简单:

import com.fasterxml.jackson.databind.ObjectMapper;
import formatter.Tweet;
import com.fasterxml.jackson.databind.DeserializationFeature;
public class FormatterTester {


static String tweet = "{\"created_at\":\"Fri May 03 11:43:17 +0000 2019\",\"id\":1124278249620566017,\"id_str\":\"1124278249620566017\",\"text\":\"RT @entkom: '\\u0e40\\u0e0b\\u0e49\\u0e19\\u0e15\\u0e4c-\\u0e28\\u0e38\\u0e20\\u0e1e\\u0e07\\u0e29\\u0e4c' \\u0e41\\u0e08\\u0e01\\u0e04\\u0e27\\u0e32\\u0e21\\u0e19\\u0e48\\u0e32\\u0e23\\u0e31\\u0e01 \\u0e21\\u0e2d\\u0e1a\\u0e04\\u0e27\\u0e32\\u0e21\\u0e2a\\u0e38\\u0e02\\u0e43\\u0e2b\\u0e49\\u0e41\\u0e1f\\u0e19\\u0e04\\u0e25\\u0e31\\u0e1a https:\\/\\/t.co\\/hBbi5hzEH8\",\"source\":\"\\u003ca href=\\\"http:\\/\\/twitter.com\\/download\\/android\\\" rel=\\\"nofollow\\\"\\u003eTwitter for Android\\u003c\\/a\\u003e\",\"truncated\":false,\"in_reply_to_status_id\":null,\"in_reply_to_status_id_str\":null,\"in_reply_to_user_id\":null,\"in_reply_to_user_id_str\":null,\"in_reply_to_screen_name\":null,\"user\":{\"id\":1062336001941504001,\"id_str\":\"1062336001941504001\",\"name\":\"\\ud83d\\udc0a\\u26bd\\ud83d\\udc2f\\ud83c\\udfb8\\ud83d\\udc99sugajin\\/\\/\\ud83d\\udc9a\\ud83d\\udc7b\\ud83d\\udc32\\ud83d\\udc0a\",\"screen_name\":\"sugajinBTS1\",\"location\":null,\"url\":null,\"description\":\"#BTS\\u597d\\u304d\\ud83d\\udc95\\u30b8\\u30f3\\u30cb\\u30e0\\u3088\\u308a\\u306e\\uff75\\uff99\\uff8d\\uff9f\\uff9d\\n#LGBTQ\\u304c\\u3082\\u3063\\u3068\\u7406\\u89e3\\u3055\\u308c\\u3066\\u6b32\\u3057\\u3044\\n#lovebychance\\u306e\\u6cbc\\u306b\\u30cf\\u30de\\u308a\\u4e2d\\n#season2\\u3068\\u3063\\u3066\\u3082\\u671f\\u5f85\\uff01\\uff01\\n#PinSon\\u2665SonPin\\n#2wish\\ud83d\\udc99\\ud83d\\udc9a\\n#Magus\\n#TeamReal\\n#LBCForever\\n\\u7121\\u8a00\\u30d5\\u30a9\\u30ed\\u30fc\\u5931\\u793c\\u3057\\u307e\\u3059\\ud83d\\ude47\",\"translator_type\":\"none\",\"protected\":false,\"verified\":false,\"followers_count\":61,\"friends_count\":224,\"listed_count\":0,\"favourites_count\":37785,\"statuses_count\":11611,\"created_at\":\"Tue Nov 13 13:26:54 +0000 2018\",\"utc_offset\":null,\"time_zone\":null,\"geo_enabled\":false,\"lang\":\"ja\",\"contributors_enabled\":false,\"is_translator\":false,\"profile_background_color\":\"F5F8FA\",\"profile_background_image_url\":\"\",\"profile_background_image_url_https\":\"\",\"profile_background_tile\":false,\"profile_link_color\":\"1DA1F2\",\"profile_sidebar_border_color\":\"C0DEED\",\"profile_sidebar_fill_color\":\"DDEEF6\",\"profile_text_color\":\"333333\",\"profile_use_background_image\":true,\"profile_image_url\":\"http:\\/\\/pbs.twimg.com\\/profile_images\\/1062337509701513216\\/5HFkKxoi_normal.jpg\",\"profile_image_url_https\":\"https:\\/\\/pbs.twimg.com\\/profile_images\\/1062337509701513216\\/5HFkKxoi_normal.jpg\",\"profile_banner_url\":\"https:\\/\\/pbs.twimg.com\\/profile_banners\\/1062336001941504001\\/1543643861\",\"default_profile\":true,\"default_profile_image\":false,\"following\":null,\"follow_request_sent\":null,\"notifications\":null},\"geo\":null,\"coordinates\":null,\"place\":null,\"contributors\":null,\"retweeted_status\":{\"created_at\":\"Fri May 03 01:29:52 +0000 2019\",\"id\":1124123879654301696,\"id_str\":\"1124123879654301696\",\"text\":\"'\\u0e40\\u0e0b\\u0e49\\u0e19\\u0e15\\u0e4c-\\u0e28\\u0e38\\u0e20\\u0e1e\\u0e07\\u0e29\\u0e4c' \\u0e41\\u0e08\\u0e01\\u0e04\\u0e27\\u0e32\\u0e21\\u0e19\\u0e48\\u0e32\\u0e23\\u0e31\\u0e01 \\u0e21\\u0e2d\\u0e1a\\u0e04\\u0e27\\u0e32\\u0e21\\u0e2a\\u0e38\\u0e02\\u0e43\\u0e2b\\u0e49\\u0e41\\u0e1f\\u0e19\\u0e04\\u0e25\\u0e31\\u0e1a https:\\/\\/t.co\\/hBbi5hzEH8\",\"source\":\"\\u003ca href=\\\"http:\\/\\/twitter.com\\\" rel=\\\"nofollow\\\"\\u003eTwitter Web Client\\u003c\\/a\\u003e\",\"truncated\":false,\"in_reply_to_status_id\":null,\"in_reply_to_status_id_str\":null,\"in_reply_to_user_id\":null,\"in_reply_to_user_id_str\":null,\"in_reply_to_screen_name\":null,\"user\":{\"id\":69565234,\"id_str\":\"69565234\",\"name\":\"ent_komchadluek\",\"screen_name\":\"entkom\",\"location\":null,\"url\":null,\"description\":null,\"translator_type\":\"none\",\"protected\":false,\"verified\":false,\"followers_count\":6684,\"friends_count\":1115,\"listed_count\":86,\"favourites_count\":14,\"statuses_count\":31813,\"created_at\":\"Fri Aug 28 11:28:17 +0000 2009\",\"utc_offset\":null,\"time_zone\":null,\"geo_enabled\":false,\"lang\":\"en\",\"contributors_enabled\":false,\"is_translator\":false,\"profile_background_color\":\"FF6699\",\"profile_background_image_url\":\"http:\\/\\/abs.twimg.com\\/images\\/themes\\/theme11\\/bg.gif\",\"profile_background_image_url_https\":\"https:\\/\\/abs.twimg.com\\/images\\/themes\\/theme11\\/bg.gif\",\"profile_background_tile\":true,\"profile_link_color\":\"B40B43\",\"profile_sidebar_border_color\":\"CC3366\",\"profile_sidebar_fill_color\":\"E5507E\",\"profile_text_color\":\"362720\",\"profile_use_background_image\":true,\"profile_image_url\":\"http:\\/\\/pbs.twimg.com\\/profile_images\\/471687167\\/ent1_normal.jpg\",\"profile_image_url_https\":\"https:\\/\\/pbs.twimg.com\\/profile_images\\/471687167\\/ent1_normal.jpg\",\"default_profile\":false,\"default_profile_image\":false,\"following\":null,\"follow_request_sent\":null,\"notifications\":null},\"geo\":null,\"coordinates\":null,\"place\":null,\"contributors\":null,\"is_quote_status\":false,\"quote_count\":9,\"reply_count\":33,\"retweet_count\":584,\"favorite_count\":505,\"entities\":{\"hashtags\":[],\"urls\":[{\"url\":\"https:\\/\\/t.co\\/hBbi5hzEH8\",\"expanded_url\":\"http:\\/\\/www.komchadluek.net\\/news\\/ent\\/370511#.XMuZj_HCjrY.twitter\",\"display_url\":\"komchadluek.net\\/news\\/ent\\/37051\\u2026\",\"indices\":[52,75]}],\"user_mentions\":[],\"symbols\":[]},\"favorited\":false,\"retweeted\":false,\"possibly_sensitive\":false,\"filter_level\":\"low\",\"lang\":\"th\"},\"is_quote_status\":false,\"quote_count\":0,\"reply_count\":0,\"retweet_count\":0,\"favorite_count\":0,\"entities\":{\"hashtags\":[],\"urls\":[{\"url\":\"https:\\/\\/t.co\\/hBbi5hzEH8\",\"expanded_url\":\"http:\\/\\/www.komchadluek.net\\/news\\/ent\\/370511#.XMuZj_HCjrY.twitter\",\"display_url\":\"komchadluek.net\\/news\\/ent\\/37051\\u2026\",\"indices\":[64,87]}],\"user_mentions\":[{\"screen_name\":\"entkom\",\"name\":\"ent_komchadluek\",\"id\":69565234,\"id_str\":\"69565234\",\"indices\":[3,10]}],\"symbols\":[]},\"favorited\":false,\"retweeted\":false,\"possibly_sensitive\":false,\"filter_level\":\"low\",\"lang\":\"th\",\"timestamp_ms\":\"1556883797446\"}";

public static void main(String[]args) {

    String valor_retorno= null;
    Tweet tw;

    try {

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        tw = objectMapper.readValue(tweet, Tweet.class);

        System.out.println("Check 3 - El formatter retorna:\n"+tw.toString());

        valor_retorno = tw.toString();
    }  catch (Exception e) {
        e.printStackTrace();
        System.out.println("\nException " + e.getClass() + ": " + e.getMessage());
    } finally {
        System.out.println("\nReturn: Valor_retorno = "+valor_retorno);
    }

}

} If you run the code you'll see it works fine. 如果你运行代码,你会发现它工作正常。 Where is the problem then? 问题出在哪里? I have to do this same operation on an Oracle NoSQL database. 我必须在Oracle NoSQL数据库上执行相同的操作。 It's not important to know any of the parts related to the data retrieval since they work fine, I've tested them. 了解与数据检索相关的任何部分并不重要,因为它们工作正常,我已经对它们进行了测试。 The code is quite similar: 代码非常相似:

String data = new String(value.toByteArray(),StandardCharsets.UTF_8);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
tw = objectMapper.readValue(data, Tweet.class);

My objective is to obtain exactly the same result as in the first code. 我的目标是获得与第一个代码完全相同的结果。 A String of values separated by '|' 由'|'分隔的值字符串 according of the attributes of my class Tweet. 根据我班级Tweet的属性。

However, this code is compressed in a Jar file, and run internally by the database over all the Tweets recorded. 但是,此代码在Jar文件中压缩,并由数据库在记录的所有推文上内部运行。 I can't see what happens nor debug it, but it produces the following exception: 我看不到发生了什么,也没有调试它,但它产生以下异常:

com.fasterxml.jackson.core.JsonParseException: Illegal character ((CTRL-CHAR, code 0)): only regular white space (\\r, \\n, \\t) is allowed between tokens com.fasterxml.jackson.core.JsonParseException:非法字符((CTRL-CHAR,代码0)):令牌之间只允许使用常规空格(\\ r,\\ n,\\ t)

I've tried scaping the string "data" with StringEscapeUtils.escapeJava(data); 我试过用StringEscapeUtils.escapeJava(data);字符串“data” StringEscapeUtils.escapeJava(data); what then produces the following exception: 然后产生以下异常:

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('\\' (code 92)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') I've also tried scaping the string like this data.replace('\\'', ' '); com.fasterxml.jackson.core.JsonParseException:意外的字符('\\'(代码92)):期望一个有效的值(数字,字符串,数组,对象,'真','假'或'空')我是也试过像这个data.replace('\\'', ' ');一样data.replace('\\'', ' ');字符串data.replace('\\'', ' '); without success. 没有成功。

I can't understand after many tests, why it runs well on the demo I put here first and not on the actual project, having exactly the same dependencies. 经过多次测试后我无法理解,为什么它在我首先放在这里的演示中运行良好,而不是在实际项目上,具有完全相同的依赖性。

For some reason, Jackson can't parse what I retrieve from the DataBase. 出于某种原因,杰克逊无法解析我从DataBase中检索到的内容。 This is most likely due to a problem of codification or decodification in the CentOS that my Docker container uses to hold the DB and where the script is invoqued and executed. 这很可能是由于我的Docker容器用来保存数据库以及脚本被取消和执行的地方在CentOS中编码或解码的问题。

In the end, using Gson for the parsing was the best option, though it would still produce errors if you don't trim() the String. 最后,使用Gson进行解析是最好的选择,但如果不修剪String,它仍然会产生错误。 Apparently, for some reason the JSON came quoted twice. 显然,出于某种原因,JSON引用了两次。 This is, ""JSON text"". 这是“”JSON文本“”。

The code: 编码:

package formatter;

import java.io.*;
import java.lang.String;
import java.nio.charset.StandardCharsets;
import java.util.List;

import oracle.kv.*;
import com.google.gson.Gson;
import oracle.kv.KeyValueVersion;
import oracle.kv.exttab.Formatter;

public class TweetFormatter implements Formatter {

    public TweetFormatter() {
        super();
    }

    public String toOracleLoaderFormat(final KeyValueVersion kvv, final KVStore kvStore){

        String valor_retorno= null;

        Tweet tw; //antes sin null

        BufferedWriter bf = FormatterUtils.getInstance().getWriter();

        try {
            final Key key = kvv.getKey();
            final Value value = kvv.getValue();
            Value.Format format = value.getFormat();

            FormatterUtils.getInstance().writeLine(bf,"[Key: "+ key + ", Value:" +value.toByteArray()+ "]" + ". Format= "+ format.toString());

            //Filtrar Clave
            List<String> major = key.getMajorPath();

            FormatterUtils.getInstance().writeLine(bf,"Check 1:\n Key is: "+key + "\n Key length is: "+major.size()
                    + "\n Values are: "+major.toString() + "\n contains: "+major.contains("TweeterStream"));

            Boolean contains = false;

            for(String x : major) {
                if(x.equals("TweeterStream")||x.equals("/TweeterStream")||x.equals("/TweeterStream/")) {
                    contains = true;
                    break;
                }
            }

            //Parsear
            if(contains){

                String data = new String(value.toByteArray(),StandardCharsets.UTF_8);

                data = data.trim();
                tw = new Gson().fromJson(data,Tweet.class); //FUNCIONA

                FormatterUtils.getInstance().writeLine(bf,"Check 3 - El formatter retorna:\n"+tw.toString());
                valor_retorno = tw.toString();
            }else{
                FormatterUtils.getInstance().writeLine(bf,"\nEstoy en else");
            }
            FormatterUtils.getInstance().writeLine(bf,"\nestoy fuera del if-else");
        }  catch (Exception e) {
            e.printStackTrace();
            FormatterUtils.getInstance().writeLine(bf, "\nException " + e.getClass() + ": " + e.getMessage());
        } finally {
            FormatterUtils.getInstance().writeLine(bf,"\nReturn: Valor_retorno = "+valor_retorno);
            FormatterUtils.getInstance().generateLog(bf);
        }
        return valor_retorno;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Riak&Java - com.fasterxml.jackson.core.JsonParseException:意外的字符(&#39;&lt;&#39;(代码60)) - Riak & Java - com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)) com.fasterxml.jackson.core.JsonParseException:意外的字符 - com.fasterxml.jackson.core.JsonParseException: Unexpected character RestTemplate::exchange() - com.fasterxml.jackson.core.JsonParseException:意外字符('&lt;'(代码 60)) - RestTemplate::exchange() - com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)) Google Http客户端库Java:com.fasterxml.jackson.core.JsonParseException:意外字符(“ G” - Google Http Client Library java: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('G' com.fasterxml.jackson.core.JsonParseException:读取json文件时出现意外字符(代码160) - com.fasterxml.jackson.core.JsonParseException: Unexpected character(code 160) while reading the json file com.fasterxml.jackson.core.JsonParseException:无法识别的字符转义符&#39;U&#39;(代码85) - com.fasterxml.jackson.core.JsonParseException: Unrecognized character escape 'U' (code 85) 如何使无法识别的字符转义 &#39;.&#39; (代码 46)被识别 - com.fasterxml.jackson.core.JsonParseException - How to make Unrecognized character escape '.' (code 46) to be Recognized - com.fasterxml.jackson.core.JsonParseException 错误 com.fasterxml.jackson.core.JsonParseException:无法识别的令牌 - Error com.fasterxml.jackson.core.JsonParseException: Unrecognized token com.fasterxml.jackson.core.JsonParseException是否为* .json.swp? - com.fasterxml.jackson.core.JsonParseException for *.json.swp? 找不到com.fasterxml.jackson.core.JsonParseException的类文件 - class file for com.fasterxml.jackson.core.JsonParseException not found
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM