【问题标题】:Deserialize Json data when the key value is dynamic键值动态时反序列化Json数据
【发布时间】:2019-04-26 15:53:55
【问题描述】:

我多年来一直在使用 JSON,但我从未遇到过键值是动态的情况。我确信还有其他情况,但在我的特殊情况下,我正在尝试反序列化 LinkedIn 流。以下是范围设置为 r_liteprofile 的数据返回请求示例。

我尝试过使用字典,但返回值始终为空。

以下是 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);

【问题讨论】:

标签: c# json serialization


【解决方案1】:

您可以将其解析为字典,方法是将您的类 Localised 替换为:

public Dictionary<string,string> Localised { get; set; }

Newtonsoft.JSON 和 Json.NET 可以自动将这些对象解析成字典。

【讨论】:

    【解决方案2】:

    我认为它必须是一些简单的东西。我试过用

    替换setter
    public Dictionary<string, string> Localized {get; set; }
    

    但结果为空。

    对我有用的方法(如 Joao Paulo Amorim 所建议的)是将 Localized 替换为 Dictionary 如下:

    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; }
    }
    

    【讨论】:

      【解决方案3】:

      为了提取我使用以下的值

      var data = System.IO.File.ReadAllText(<<file address>>);
      var result = JsonConvert.DeserializeObject<LinkedLiteProfile>(data);
      var firstName = result.firstName.localized.Values.FirstOrDefault();
      

      【讨论】:

        猜你喜欢
        • 2012-11-11
        • 1970-01-01
        • 2017-01-24
        • 2021-09-14
        • 2017-12-19
        • 1970-01-01
        • 2019-12-20
        相关资源
        最近更新 更多