杰克逊和格森反序列化不一致?
Jackson and Gson inconsistent for deserialization?
我观察到关于 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?
- 如果是,为什么 Jackson 无法解析它?
- 如果不是,为什么 Gson 允许它被解析?
谢谢。
这一行:
String jsonString1 = "{\"text\":\"123\nabc\"}";
创建一个包含字符
的字符串
{"text":"123<newline>abc"}
其中确实是一个换行符。
JSON 规范要求字符串中的换行符必须转义为 \n,因此 jsonString1 不包含有效的 JSON,解析器应该拒绝它。要创建包含字符 \n 的字符串,您的源代码应为
String jsonString1 = "{\"text\":\"123\nabc\"}";
所以源代码包含一个转义的反斜杠后跟一个 n。该字符串将包含一个反斜杠后跟一个 n,并且 JSON 解析器会将其解析为换行符。
我观察到关于 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?- 如果是,为什么 Jackson 无法解析它?
- 如果不是,为什么 Gson 允许它被解析?
谢谢。
这一行:
String jsonString1 = "{\"text\":\"123\nabc\"}";
创建一个包含字符
的字符串{"text":"123<newline>abc"}
其中确实是一个换行符。
JSON 规范要求字符串中的换行符必须转义为 \n,因此 jsonString1 不包含有效的 JSON,解析器应该拒绝它。要创建包含字符 \n 的字符串,您的源代码应为
String jsonString1 = "{\"text\":\"123\nabc\"}";
所以源代码包含一个转义的反斜杠后跟一个 n。该字符串将包含一个反斜杠后跟一个 n,并且 JSON 解析器会将其解析为换行符。