单元测试如何使用JSON -net将JSON对象反序列化为动态对象

本文关键字:JSON 对象 反序列化 动态 -net 何使用 单元测试 | 更新日期: 2023-09-27 18:09:05

使用MSTest,当我尝试运行一个具有动态类型的测试时,该类型是JSON对象的容器(来自API查询),我希望能够在下面注释中解引用JSON元素,但它失败了,将其视为一个项目集合似乎是可以的。如果inspect '(jsonResponse.message)'它有一个值"Hi" -但它不会在单元测试中工作。为什么呢?

//http://www.newtonsoft.com/json/help/html/LINQtoJSON.htm//使用Json.net将json对象反序列化为动态对象

[TestMethod]
public void DynamicDeserialization()
{
    dynamic jsonResponse = JsonConvert.DeserializeObject("{'"message'":'"Hi'"}");
    JObject  d = JObject.Parse("{'"message'":'"Hi'"}");
    Assert.IsTrue((string)d["message"]  == "Hi");          // Is ok
// Assert.IsTrue(jsonResponse.message.ToString() == "Hi"); // is not ok
}    

单元测试如何使用JSON -net将JSON对象反序列化为动态对象

最后一行没有注释,运行代码,测试工作/通过。如果您在调试时查看jsonResponse,您将看到它是一个JObject,也被包装为dynamic

事实上,如果我将d转换为dynamic,我可以执行相同的断言,并且它也通过了。

[TestMethod]
public void DynamicDeserialization() {
    var json = "{'"message'":'"Hi'"}";
    dynamic jsonResponse = JsonConvert.DeserializeObject(json);
    dynamic d = JObject.Parse(json);
    Assert.IsTrue(d.message.ToString() == "Hi");
    Assert.IsTrue(jsonResponse.message.ToString() == "Hi");
}

您可能需要检查以确保您使用的是最新版本的Json。净