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;
code
是dataObject
的动态成员,而不是我在上面声明的字符串代码。我如何使用我声明的code
,而不是它认为dataObject
中存在的动态代码,因为它是动态的。
答案 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