我已经使用JSON多年了,但是我从来没有遇到过键值是动态的情况。我确定还有其他情况,但是在我的特定情况下,我正在尝试反序列化LinkedIn流。以下是在范围设置为r_liteprofile的情况下返回的数据请求的示例。
我尝试使用Dictionary,但是返回值始终为null。
以下是从LinkedIn API调用返回的数据的示例:
{
"id": "REDACTED",
"firstName": {
"localized": {
"en_US": "Tina"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"lastName": {
"localized": {
"en_US": "Belcher"
},
"preferredLocale": {
"country": "US",
"language": "en"
}
},
"profilePicture": {
"displayImage": "urn:li:digitalmediaAsset:B54328XZFfe2134zTyq"
}
}
我不了解的是在反序列化数据时如何处理“本地化”。如果我预计键值将为“ en_US”,则一切正常。但这并非永远都是正确的。根据我的研究,不同值的数量是有限的,以下是可用键的子集。
{
"localized": {
"de_DE": "LinkedIn",
"en_US": "LinkedIn",
"es_ES": "LinkedIn",
"in_ID": "LinkedIn"
}
}
以下是类型定义:
public class Localized
{
public string en_Us { get; set; }
}
public class PreferredLocale
{
public string country { get; set; }
public string language { get; set; }
}
public class LastName
{
public Localized localized { get; set; }
public PreferredLocale preferredLocale { get; set; }
}
public class FirstName
{
public Localized localized { get; set; }
public PreferredLocale preferredLocale { get; set; }
}
public class ProfilePicture
{
public string displayImage { get; set; }
}
public class LinkedLiteProfile
{
public LastName lastName { get; set; }
public FirstName firstName { get; set; }
public ProfilePicture profilePicture { get; set; }
public string id { get; set; }
}
和代码:
var data = System.IO.File.ReadAllText(<<file address>>);
var result = JsonConvert.DeserializeObject<LinkedLiteProfile>(data);
答案 0 :(得分:1)
您可以将类Localised
替换为:
public Dictionary<string,string> Localised { get; set; }
Newtonsoft.JSON和Json.NET可以自动将这些对象解析为字典。
答案 1 :(得分:0)
我认为这必须是简单的事情。我曾尝试用#p>代替二传手
public Dictionary<string, string> Localized {get; set; }
但结果为空。
对我有用的(如Joao Paulo Amorim所建议的)是用以下字典代替Localized:
public class LastName
{
public Dictionary<string, string> localized { get; set; }
public PreferredLocale preferredLocale { get; set; }
}
public class FirstName
{
public Dictionary<string, string> localized { get; set; }
public PreferredLocale preferredLocale { get; set; }
}
答案 2 :(得分:0)
要提取值,我使用了以下
var data = System.IO.File.ReadAllText(<<file address>>);
var result = JsonConvert.DeserializeObject<LinkedLiteProfile>(data);
var firstName = result.firstName.localized.Values.FirstOrDefault();