Newtonsoft.Json SerializeObject没有转义反斜杠

g18*_*18c 30 c# json json.net

鉴于代码:

dynamic foo = new ExpandoObject();
foo.Bar = "something";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
Run Code Online (Sandbox Code Playgroud)

输出如下:

"{\"Bar\":\"something\"}"
Run Code Online (Sandbox Code Playgroud)

在调试大型json文档时,很难阅读 - 使用Newtonsoft.Json的内置功能(不是正则表达式或可能破坏事物的黑客)有没有办法使输出成为一个带有valie的字符串:

{Bar: "something"}
Run Code Online (Sandbox Code Playgroud)

Rid*_*son 16

尝试 JToken.Parse 方法。我发现,即使当我在调试器中查看 JSON 对象并且它们是正确的时,当我去操作它们时,它们最终会被转换为文字(即添加反斜杠)。JToken.Parse 方法似乎避免了这种情况。

var token = JToken.Parse(text);
Run Code Online (Sandbox Code Playgroud)

所以对于原来的问题来说,它会是这样的:

dynamic foo = new ExpandoObject();
foo.Bar = "something";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
var token = JToken.Parse(json);
//Do stuff with token -- not json string
Run Code Online (Sandbox Code Playgroud)

就我而言,具体问题是使用 JObject.Add(json) 无法识别我的字符串是 json,而只是将整个字符串作为单个属性插入。一旦转换为 Jtoken,JSON 就会被正确解释。


dev*_*yan 10

如果在从WebApi方法返回值时发生这种情况,请尝试返回对象本身,而不是序列化对象并返回json字符串.默认情况下,WebApi会将对象序列化为响应中的json; 如果你返回一个字符串,它将转义它找到的任何双引号.

所以代替:

public string Get()
{
    ExpandoObject foo = new ExpandoObject();
    foo.Bar = "something";
    string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
    return json;
}
Run Code Online (Sandbox Code Playgroud)

尝试:

public ExpandoObject Get()
{
    ExpandoObject foo = new ExpandoObject();
    foo.Bar = "something";
    return foo;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我想编写单元测试来检查序列化输出的样子,我该怎么办? (2认同)

S52*_*S52 9

老问题,但我发现了这个,

就我而言,我正在调试器中查看 JSON 字符串,我发现它正在添加转义。

当我将 JSON 打印到控制台时,它没有转义字符。希望能帮助到你。


Gia*_*sio 6

在查看json值时在调试器中看到的是您应该在C#文件中使用以获取相同值的字符串值.

确实你可以替换

dynamic foo = new ExpandoObject();
foo.Bar = "something";
string json = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
Run Code Online (Sandbox Code Playgroud)

string json = "{\"Bar\":\"something\"}";
Run Code Online (Sandbox Code Playgroud)

不改变程序的行为.

因此,要获得不同的值,您应该更改JsonConvert的工作方式,但JsonConvert符合JSON标准,因此忘记它!

如果你实际上并没有序列化ExpandoObject(也没有任何其他密封类在你的控件之外),你可以使用你在json中序列化的类型的DebuggerDisplayAttribute来定义在调试期间如何显示对象(在你的代码中,foo实例).

但字符串是一个字符串,VisualStudio是正确的:双引号必须转义.

  • 当您从Web服务SerializeObject一个对象时会发生这种情况.您在Web浏览器输出中看到的是转义字符串,这会使输出无效,除非您想在客户端处理该snafu.不,谢谢,我更愿意从我的网络服务中将适当的json发送给我的客户.换句话说,我的Web服务应该返回我给它的字符串,就像我给它的那样. (3认同)