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

时间:2015-03-18 17:47:47

标签: json jackson gson

我观察到关于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. 如果是,杰克逊为什么无法解析它?
  3. 如果不是,为什么Gson允许对其进行解析?
  4. 感谢。

1 个答案:

答案 0 :(得分:3)

这一行:

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

创建一个包含字符

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

这里真的是换行符。

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

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

因此源代码包含一个转义后的反斜杠,后跟一个n。该字符串将包含一个反斜杠后跟一个n,而JSON解析器将它解析为换行符。