这两种JSON格式有什么区别?

8

我有下面这个简单的类:

public class Test
{
    public string property1 { get; set; }
    public string property2 { get; set; }
}

当我尝试使用以下方法将其序列化为 JSON:

Test t = new Test() { property1 = "p1", property2 = "p2" };
var serializedData = JsonConvert.SerializeObject(t, Formatting.None);

我收到了下面这样的JSON数据: enter image description here 当我尝试将其提交给WEB API应用程序时,它会被识别为null。我在content header中使用了application/json
但是如果我将同一个类以字符串形式提交,则可以正常工作:
string test = "{\"property1\":\"p1\",\"property2\":\"p2\"}";
var serializedData = JsonConvert.SerializeObject(test, Formatting.None);

但在可视化工具中看起来像这样:

enter image description here

如果我将这两个字符串粘贴到记事本中,它们看起来完全相同。

有什么想法为什么类序列化不起作用呢?


你是从API控制器返回这个还是从JavaScript中发布的?当从控制器返回字符串并将其视为json时,除非你明确设置内容类型,否则可能会出现问题。你能发布你的控制器代码吗? - Sanjay Singh
Visual Studio可能会使用过于聪明的转义方式,导致混淆。要查看字符串的实际内容,在即时窗口中键入Debug.WriteLine(serializedData)。您将看到第一个是具有两个属性的JSON对象,第二个是JSON字符串,其内容是已转义为字符串文字的JSON对象。至于为什么第一个情况在服务器上出现为空,您能否分享调用的代码? - dbc
你是如何将它提交到WebAPI的? - Konamiman
我正在使用WebClient Upload方法进行提交,并将其设置为POST。 - 4thSpace
1个回答

1
JSON序列化工作正常。在第一种情况下,当您序列化对象时,它会返回普通的JSON:
{
    "property1": "p1",
    "property2": "p2"
}

在第二种情况下,您已经手动序列化了JSON,并且正在尝试第二次序列化它,这将导致一个新的JSON包含一个JSON本身作为单个值或更可能是单个键:
{ "{\"property1\":\"p1\",\"property2\":\"p2\"}" }

您可以运行以下代码来测试第二个字符串是否已经序列化:

var serializedData2 = JsonConvert.DeserializeObject(test);

它应该返回JSON的键值对:
{
    "property1": "p1",
    "property2": "p2"
}

我猜空值来自其他地方。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接