Десериализовать данные Json, когда значение ключа является динамическим - PullRequest
0 голосов
/ 26 апреля 2019

Я работал с JSON годами, но никогда не сталкивался с ситуацией, когда ключевые значения являются динамическими. Я уверен, что есть другие ситуации, но в моем конкретном случае я пытаюсь десериализовать поток LinkedIn. Ниже приведен пример запроса возвращенных данных, выполненного с областью действия, равной r_liteprofile.

Я пытался использовать словарь, но возвращаемое значение всегда равно нулю.

Ниже приведен пример возврата данных из вызова API LinkedIn:

{
  "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 ]

1 голос
/ 26 апреля 2019

Вы можете разобрать его в словарь, заменив класс Localised на:

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

Newtonsoft.JSON и Json.NET могут автоматически анализировать эти объекты в словаре.

0 голосов
/ 26 апреля 2019

Для извлечения значения я использовал следующее

var data = System.IO.File.ReadAllText(<<file address>>);
var result = JsonConvert.DeserializeObject<LinkedLiteProfile>(data);
var firstName = result.firstName.localized.Values.FirstOrDefault();
0 голосов
/ 26 апреля 2019

Я подумал, что это должно быть что-то простое.Я пытался заменить сеттер на

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

, но результат был нулевым.

Для меня (как предложил Жоао Пауло Аморим) сработало заменить Локализованный словарь следующим образом:

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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...