我观察到关于Jackson和Gson允许换行符出现在JSON对象的字符串表示中的方式的不一致行为。请考虑以下最小的例子。
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import java.io.IOException;
public class GsonTest {
public static void main(String[] args) throws IOException {
//Json string with a literal newline
String jsonString1 = "{\"text\":\"123\nabc\"}";
// Parse jsonString1 with Jackson
ObjectMapper mapper = new ObjectMapper();
// System.out.println(mapper.readValue(jsonString1, TestObj.class)); // produces JsonMappingException, uncomment to run
// Parse jsonString1 with Gson
Gson gson = new Gson();
System.out.println(gson.fromJson(jsonString1, TestObj.class)); // parses fine
// Json string with escaped newline
String jsonString2 = "{\"text\":\"123\\nabc\"}";
// Parse jsonString2 with Jackson
System.out.println(mapper.readValue(jsonString2, TestObj.class)); // parses fine
// Parse jsonString2 with Gson
System.out.println(gson.fromJson(jsonString2, TestObj.class)); // parses fine
}
}
class TestObj {
public String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
我的问题是:
jsonString1
是否有效JSON?感谢。
答案 0 :(得分:3)
这一行:
String jsonString1 = "{\"text\":\"123\nabc\"}";
创建一个包含字符
的字符串{"text":"123<newline>abc"}
这里真的是换行符。
JSON规范要求字符串中的换行符必须转义为\ n,因此jsonString1不包含有效的JSON,解析器应该拒绝它。要创建包含字符\ n的字符串,您的源代码应为
String jsonString1 = "{\"text\":\"123\\nabc\"}";
因此源代码包含一个转义后的反斜杠,后跟一个n。该字符串将包含一个反斜杠后跟一个n,而JSON解析器将它解析为换行符。