动态/解析Json对象

时间:2018-05-10 00:22:00

标签: c#

在下面的代码片段中,我不明白" //失败"下面的代码与" //下面的代码之间的差异" (在创建Azure函数时作为样板代码提供。)注意:我意识到对象的强制转换是不必要的,但ReadAsAsync返回对象....

public static class FunctionTest
{
    [FunctionName("TestFunction")]
    public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
    {
        log.Info("C# HTTP trigger function processed a request.");

        // parse query parameter
        string name = req.GetQueryNameValuePairs()
          .FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0)
          .Value;

        //if nothing in the query parameter - lets' look into the body
        if (name == null)
        {
            //this fails
            dynamic abc = (object) @"{""name"":""test""}";
            string test = abc?.name;

            // this works
            dynamic data = await req.Content.ReadAsAsync<object>();
            name = data?.name;
        }

        return name == null
          ? req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body")
          : req.CreateResponse(HttpStatusCode.OK, "Hello " + name);
    }
}

1 个答案:

答案 0 :(得分:3)

第一行:

dynamic abc = (object) @"{""name"":""test""}";

将获取string值并将其转换为object。这并不意味着它会将字符串视为JSON并创建一个具有name属性的新动态对象。它仍然是string,内容并不重要。

然而第二行:

dynamic data = await req.Content.ReadAsAsync<object>();

使用通用类型ReadAsAsync调用object方法。这实际上为object转换为name = data["name"]; ,具有各种属性意味着您可以执行此操作:

dynamic

因为它是dynamic,所以有效地将您的代码转换为上述代码。但是,几乎每次我看到public class Foo { public string Name { get; set; } } 时,它都会产生代码味道,这没什么区别。而是使用正确的属性创建一个具体的类并使用它。这样,您将进行编译时类型检查,而不是依赖于动态对象。例如:

Foo data = await req.Content.ReadAsAsync<Foo>();

并像这样使用它:

{{1}}