字符串和动态对象之间的歧义

ambiguity between a string and a dynamic object

        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;

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

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

我根本不会使用 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