杰克逊和格森反序列化不一致?

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;
    }
}

我的问题是:

  1. jsonString1有效吗JSON?
  2. 如果是,为什么 Jackson 无法解析它?
  3. 如果不是,为什么 Gson 允许它被解析?

谢谢。

这一行:

String jsonString1 = "{\"text\":\"123\nabc\"}";

创建一个包含字符

的字符串
{"text":"123<newline>abc"}

其中确实是一个换行符。

JSON 规范要求字符串中的换行符必须转义为 \n,因此 jsonString1 不包含有效的 JSON,解析器应该拒绝它。要创建包含字符 \n 的字符串,您的源代码应为

String jsonString1 = "{\"text\":\"123\nabc\"}";

所以源代码包含一个转义的反斜杠后跟一个 n。该字符串将包含一个反斜杠后跟一个 n,并且 JSON 解析器会将其解析为换行符。