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

时间:2018-06-17 14:03:59

标签: c# json dynamic deserialization ambiguous

        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的网址。现在最后一行return dataObject.langs.code;返回null,因为在dataObject(动态对象)中的json中没有这样的条目。但是return dataObject.langs.ru;会返回一个我期待的正确字符串。

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

1 个答案:

答案 0 :(得分: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