【问题标题】:ambiguity between a string and a dynamic object字符串和动态对象之间的歧义
【发布时间】:2018-11-26 14:05:58
【问题描述】:
        string code = "ru";
        string searchUrl = $"{Endpoint}getLangs?key={ApiKey}&ui=en";
        string json;
        using (var client = new WebClient())
        {
            json = client.DownloadString(searchUrl);
        }

        var dataObject = JsonConvert.DeserializeObject<dynamic>(json);
        return dataObject.langs.code;

在这个 sn-p 中,searchUrl 是一个字符串,包含我正在使用的 API 的 URL。现在最后一行return dataObject.langs.code; 返回null,因为在dataObject(动态对象)中的json 中没有这样的条目。但是return dataObject.langs.ru; 返回一个我期望的正确字符串。

发生这种情况是因为return dataObject.langs.code; codedataObject 的动态成员,而不是我在上面声明的字符串代码。我如何使用我声明的 code 而不是它认为存在于 dataObject 中的动态代码,因为它是动态的。

【问题讨论】:

    标签: c# json dynamic deserialization ambiguous


    【解决方案1】:

    我根本不会使用dynamic。当您知道要在编译时使用的名称时,这通常很有用。我将反序列化为JObject 并仅使用索引器,您可以在其中使用您在编译时知道的名称(如"langs")或仅在执行时知道的名称(如code)提供属性名称:

    var dataObject = JObject.Parse(json);
    // Modify this to cast to whatever type you're actually interested in
    return (string) dataObject["langs"][code];
    

    这是一个完整的例子:

    using System;
    using System.IO;
    using Newtonsoft.Json.Linq;
    
    class Test
    {
        static void Main()
        {
            string json = File.ReadAllText("test.json");
            string code = "ru";
            JObject dataObject = JObject.Parse(json);
            string result = (string) dataObject["langs"][code];
            Console.WriteLine(result);
        }
    }
    

    使用 test.json 包含:

    {
      "langs": {
        "ru": "Russian",
        "en": "English",
        "fr": "French"
      },
      "misc": {
        "foo": "bar"
      }
    }
    

    输出:

    Russian
    

    【讨论】:

    • "当您知道要在编译时使用的名称时,这通常很有用。" - 你不是说不知道名字吗?
    • @Enigmativity:不,我的意思正是我写的。动态类型让您编写dynamic d = ...; string result = d.Foo;,但如果您在编写代码时不知道名称“Foo”,这对您没有帮助。我知道考虑到“动态”这个词,这听起来有点奇怪,但这就是它的工作方式。
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多