Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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 如何将fasterxml.jackson api导致的JSON数据中的反斜杠和引号一起去掉?_Java_Json_Regex_Mongodb_Jackson - Fatal编程技术网

Java 如何将fasterxml.jackson api导致的JSON数据中的反斜杠和引号一起去掉?

Java 如何将fasterxml.jackson api导致的JSON数据中的反斜杠和引号一起去掉?,java,json,regex,mongodb,jackson,Java,Json,Regex,Mongodb,Jackson,需要Json数据方面的帮助。我试过几种方法,但不知怎么的,我找不到任何解决办法 List<BookInfo> list = new ArrayList<BookInfo>(); String data = null; while (cursor.hasNext()) { BookInfo bs= new BookInfo(); DBObject dbo = cursor.next(); ArrayList

需要Json数据方面的帮助。我试过几种方法,但不知怎么的,我找不到任何解决办法

   List<BookInfo> list = new ArrayList<BookInfo>();
   String data = null;
   while (cursor.hasNext()) { 
        BookInfo bs= new BookInfo();
        DBObject dbo = cursor.next();
        ArrayList<DBObject> urlArr = (ArrayList<DBObject>)dbo.get("url"); 
        bs.setUrl(urlArr.toString());
        list.add(bs);
        ObjectMapper mapper = new ObjectMapper();
        data = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(list);
   }
   return data;
输出应为:

    "url": [ { "uri" : "http://books.info/science"}, { "uri" : "http://books.info/western"}]

需要去掉access双引号和反斜杠。由于fasterxml.jackson api,返回JSON数据时会创建额外的双引号和反斜杠。有人知道如何避免这种情况吗?

之所以会出现这种问题,是因为
replaceAll
的第一个参数不是字符串,而是正则表达式。反斜杠是一个符号,这意味着它需要转义

这可能会让人困惑,因为反斜杠也是Java的特殊字符,需要再次转义

"\\" - single backslash
"\\\\" - single backslash in regex
"\\\\\\\\" - two backslashes in regex
换句话说,你有2个反斜杠,所以正则表达式匹配它将是4个反斜杠。但是这个正则表达式是用Java编写的,所以需要对所有4个反斜杠进行转义,使其成为8个反斜杠。然后是一个双引号
\“
给出了一个很好的9个反斜杠序列

请尝试以下代码:

String s = "\\\\\"test";    // the actual String is: \\"test
System.out.println(s);
System.out.println(s.replaceAll("\\\\\\\\\"", "\""));

请提供您的代码、预期输出和当前输出,否则您将在一周内获得否决票:)请向我们展示您尝试的无效内容。此外,我们需要知道您正在处理的字符串是您显示的整个键值对,还是仅是值的文本(没有外部双引号)。如何
text=text.replaceAll(“\\\\”,“\\”)
?我不是一个经验丰富的程序员。我在工作和学习。所以有些部分对我来说很难。我正在尽力应付。请重新打开它,或者至少给我一个解决方案。如果您需要的不仅仅是
“\/code>”
(Java正则表达式中的文字
字符串),最好使用带有
\Q
\E
的引号块,而不是转义字符的级联。在本例中:
System.out.println(s.replaceAll(\\Q\\\\E\,“\”);
,它将等效于文本字符串
\”
在Java正则表达式中的方式和长度与
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>相同。实际上,它应该是
\\\Q\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/code>转义正则表达式元字符,但仍需要两个反斜杠转义为Java特殊字符(即
\\Q
\\e
之间有4个反斜杠)。你说得对,我忘记了正则表达式引用块中的Java转义。但是,关于“(…)哪一个更好?”,我的意图并不是专门针对这个案例,而是作为一般的建议,我的观点仍然是:如果你有大量的正则转义字符级联,那么最好使用正则转义块,以提高可读性和减少长度。
String s = "\\\\\"test";    // the actual String is: \\"test
System.out.println(s);
System.out.println(s.replaceAll("\\\\\\\\\"", "\""));