解析来自 API 的动态 jsonResult 响应给出“对象不包含 X 的定义”

Posted

技术标签:

【中文标题】解析来自 API 的动态 jsonResult 响应给出“对象不包含 X 的定义”【英文标题】:Parsing dynamic jsonResult response from API gives "object does not contain definition for X" 【发布时间】:2018-03-22 21:08:09 【问题描述】:

我试图像这样返回一个非常简单的匿名对象作为 Json:

    [HttpGet]
    public JsonResult GetJson()
    
        return Json(new 
            id = 1,
            child = new
            
                id = 12, 
                name = "woop woop"
             
        );
    

然后我有一个测试用例验证 id = 1

    [TestMethod]
    public void TestMethod4()
    
        var controller = new ValuesController();
        dynamic result = controller.GetJson();

        Assert.AreEqual(1, result.Value.id);
    

这导致:

消息:测试方法 UnitTestProject1.UnitTest1.TestMethod4 抛出 异常:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: “object”不包含“id”的定义

【问题讨论】:

【参考方案1】:

您的方法返回一个JsonResult,其中包含一个属性Data,这是您的对象,因此您的代码应该是

[TestMethod]
public void TestMethod4()

    var controller = new ValuesController();
    dynamic result = controller.GetJson().Data; // returns  id = 1, child = new  id = 12, name = "woop woop"  
    Assert.AreEqual(1, result.id);

但是匿名对象是internal,因此您还需要使您的对象对您的测试项目可见。在包含ValuesController类的项目的AssemblyInfo.cs文件中,添加

[assembly: InternalsVisibleTo("YourProjectName.UnitTestProject1")]

【讨论】:

不错的答案。也会对其他人有所帮助 GetJson() 没有 .Data,它有 .Value。我没有任何 AssemblyInfo.cs 文件。这是一个 .Net Core 1.1 项目。 然后正确标记您的问题! 请参阅this answer 以获取与AssemblyInfo.cs 等效的信息 还有this answer

以上是关于解析来自 API 的动态 jsonResult 响应给出“对象不包含 X 的定义”的主要内容,如果未能解决你的问题,请参考以下文章

从没有属性的 web api 返回 JsonResult

快速解析从 API 以 JSON 形式返回的对象

从web api返回没有其属性的JsonResult

ASP.NET Core API 中的 IActionResult vs ObjectResult vs JsonResult

如何使用 GSON 解析动态 JSON 字段?

如何通过 Asp.Net Core 中间件的 JsonResult 响应?