Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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 将带有特殊字符的字符串转换为JSONObject_Java_Json - Fatal编程技术网

Java 将带有特殊字符的字符串转换为JSONObject

Java 将带有特殊字符的字符串转换为JSONObject,java,json,Java,Json,我的输入字符串是“{”notes\u text:“someString”}”。someString可以包含\或“.”,我需要创建一个表示该字符串的JSONObject 只要使用以字符串作为输入的构造函数,如果它包含特殊字符,就会抛出异常 我尝试了几种方法来实现这一点 使用库对字符进行转义-这将导致,例如,“{\”注释\文本\”:\“\”\“\”}”或“{\”注释\文本\“:\“\\”}”。我需要分别将它们更改为“{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

我的输入字符串是
“{”notes\u text:“someString”}”
。someString可以包含\或“.”,我需要创建一个表示该字符串的JSONObject

只要使用以字符串作为输入的构造函数,如果它包含特殊字符,就会抛出异常

我尝试了几种方法来实现这一点

  • 使用库对字符进行转义-这将导致,例如,
    “{\”注释\文本\”:\“\”\“\”}”
    “{\”注释\文本\“:\“\\”}”
    。我需要分别将它们更改为
    “{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  • 不要转义输入字符串中的特殊字符,而是使用字符串替换方法将\转换为\和“转换为\”。但这将再次替换输入字符串中的所有双引号
我尝试使用正则表达式,但无法理解
str.replaceAll(“\\\\”*\\\\“*\\\\”,replacemntString)类中的替换字符串
以下两个类解决了json中断的初始问题:

公共类FixedJson{
私有最终字符串目标;
私人最终模式;
public-FixedJson(字符串目标){
这个(
目标,,
Pattern.compile(“\”(.+?)\“[^\\w\”]))
);
}
public-FixedJson(字符串目标、模式){
this.target=目标;
这个模式=模式;
}
公共字符串值(){
返回this.pattern.matcher(this.target).replaceAll(
匹配结果->{
StringBuilder sb=新的StringBuilder();
附加(
matchResult.group(),
0,
matchResult.start(1)-matchResult.start(0)
);
附加(
新逃脱(
新转义(matchResult.group(1)).value()
).value()
);
附加(
matchResult.group()子字符串(
matchResult.group().length()-(matchResult.end(0)-matchResult.end(1))
)
);
使某人返回字符串();
}
);
}
}
已转义的公共类{
私有最终字符串目标;
私人最终模式;
公共转义(字符串目标){
这个(
目标,,
Pattern.compile(“[\”]”)
);
}
公共转义(字符串目标、模式){
this.target=目标;
这个模式=模式;
}
公共字符串值(){
把这个还给我
.matcher(此.target)
.replaceAll(“\\$0”);
}
}
单元测试 我已经编写了单元测试来证明其正确性:

import java.util.regex.Pattern;
导入静态org.junit.jupiter.api.Assertions.assertEquals;
导入org.junit.jupiter.api.Test;
公共类FixedJsonTest{
@试验
公共值(){
资产质量(
“{\'notes\u text\':\'someString\'”,
新的FixedJson(“{\”注释\文本\“:\”某些字符串\“}”).value()
);
}
@试验
public void valueWithOneDoubleQuotes(){
资产质量(
“{\”注释\文本\“:\”\“\”}”,
新的FixedJson(“{\”注释\文本\“:\”\“\”}”).value()
);
}
@试验
具有一个DoubleQuotesAndOtherValue()的公共无效值{
资产质量(
“{\'notes\'u text\”:\“\”,\“hello\”:\“world\”,
新的FixedJson(“{\”注释\文本\“:\”,“\”你好\“:\”世界\“}”).value()
);
}
@试验
public void value with two doublequotes(){
资产质量(
“{\'notes\'u text\”:\“\\\”\\\\“\”}”,
新的FixedJson(“{\”注释\文本\“:\”\“\”\”}”).value()
);
}
@试验
具有两个DoubleQuotes和OtherValue()的公共无效值{
资产质量(
“{\'notes\'u text\”:\“\\\”,\“hello\”:“world\”,
新的FixedJson(“{\”注释\文本\“:\”,“\”你好\“:\”世界\“}”).value()
);
}
@试验
public void valueWithOneSlash(){
资产质量(
“{\'notes\'u text\”:\“{\\\”,
新的FixedJson(“{\”注释\文本\“:\“\\\”}”).value()
);
}
@试验
public void valueWithOneSlashAndAnotherValue(){
资产质量(
“{\'notes\u text\”:\“\”,“hello\”:“world\”,
新的FixedJson(“{\”注释\文本\“:\”,“\”你好\“:\”世界\“}”).value()
);
}
@试验
带两个斜杠的公共无效值(){
资产质量(
“{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\”,
新的FixedJson(“{\”注释\文本\“:\”\”).value()
);
}
@试验
带有两个斜杠和另一个斜杠的公共无效值(){
资产质量(
“{\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\,
新的FixedJson(“{\”注释\文本\“:\”,“hello\”:“world\”)值()
);
}
}
导入静态org.junit.jupiter.api.Assertions.assertEquals;
导入org.junit.jupiter.api.Test;
公共类逃逸测试{
@试验
public void doublequotetest(){
资产质量(
新转义(“\”).value(),
"\\\""
);
资产质量(
新转义的(“abc\“def”).value(),
“abc\\\“def”
);
}
@试验
公共无效slashetest(){
资产质量(
新转义(“\\”).value(),
"\\\\"
);
资产质量(
新转义的(“abc\\def”).value(),
“abc\\\\def”
);
}
@试验
公共无效混合测试(){
资产质量(
新转义(“\\\”).value(),
"\\\\\\\""
);
资产质量(
fixedJson = {"notes_text":"\""}