字符串和动态对象之间的歧义
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;
code
是 dataObject
的动态成员,而不是我上面声明的字符串代码。我如何使用我声明的 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
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;
code
是 dataObject
的动态成员,而不是我上面声明的字符串代码。我如何使用我声明的 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