当键值为动态时反序列化Json数据

时间:2019-04-26 15:53:56

标签: c# json serialization

我已经使用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);

3 个答案:

答案 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();