Подтвердить что ты не робот

Назначить несколько JsonProperties?

Я пытаюсь создать единый пакет данных, который содержит информацию как от Facebook, так и от Twitter.

но в моем ответе JSON из twitter мне нужно id_str, а из FaceBook я получаю id.

Мне нужно, чтобы эти два были помещены в строку id -string.

Теперь я знаю, что могу использовать [JsonProperty("id_str")], если я хочу десериализовать Twitters id_str в моей id -строке.

Но что, если мне нужно как Facebook id, так и Twitters id_str десериализоваться в той же id -string, что у меня в моем dataclass?

4b9b3361

Ответ 1

Нет, это невозможно.

Посмотрим на документацию Json.NET. В частности, страница справки о JsonPropertyAttribute классе.

Цитата:

"Указывает JsonSerializer всегда сериализовать член с указанным именем.

Он объявлен в пространстве имен Newtonsoft.Json. Нам нужно определить, как это объявлено. Давайте взглянем на исходный код Json.NET на CodePlex:

http://json.codeplex.com/

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property |     
 AttributeTargets.Parameter, AllowMultiple = false)]
public sealed class JsonPropertyAttribute : Attribute
{
    //...
}

Угадайте, что отвечает на вопрос. Свойству AllowMultiple атрибута присваивается значение false. Таким образом, вы не можете украсить свойство, поле или параметр более одного раза этим атрибутом.

Даже если бы вы могли ожидать, что Json.net выяснит, какой атрибут использовать? Я бы создал типы для Twitter и Facebook отдельно, в которые вы можете десериализовать полученные данные JSON.

Итак:

Twitter -> JSON -> Twitter specific types
Facebook -> JSON -> Facebook spefic types

Затем создайте абстракцию, используемую вашим приложением, вместо прямого обращения к этим типам. Они просто принадлежат к реализации определенных социальных сетей.

Twitter/Facebook/... speficic types → Ваши типы

Если вы пытаетесь десериализовать данные в своих "общих типах", вы просто будете продолжать бороться, потому что они не выравнивают 100% с полученными данными, и вы можете столкнуться с некоторыми напуганными, поддерживать логику десериализации.

Другой вариант - создать собственный конвертер Json.NET.

http://geekswithblogs.net/DavidHoerster/archive/2011/07/26/json.net-custom-convertersndasha-quick-tour.aspx

Просто создайте конвертер для Twitter и Facebook, а при десериализации данных JSON просто укажите, какой конвертер вы хотите использовать.

  • TwitterConverter
  • FacebookConverter

например:.

MySocialType myType = JsonConvert.DeserializeObject<Mapped>(json, 
    new TwitterConverter());

В любом случае я постараюсь избежать загрязнения типов вашего класса самой логикой десериализации.

Ответ 2

Я думаю, что я решил это самым простым способом...

    public string id_str { 
        get{return id;}
        set{id = id_str;}
    }

    public string id { get; set; }

Просто добавили оба и сделали одно, установите другое. Это работает: P Иногда простые решения являются лучшими?

Ответ 3

Если вы ищете универсальную модель класса для потребления, вы можете сделать это следующим образом.

public class GenericClass
{
    public virtual string ID {get;set;}
}
public class FaceBook : GenericClass
{
    [JsonProperty("id")]
    public override string ID { get => base.ID; set => base.ID = value; }
}
public class Twitter : GenericClass
{
    [JsonProperty("id_str")]
    public override string ID { get => base.ID; set => base.ID = value; }
}

Для Facebook,

GenericClass genericClass = JsonConvert.DeserializeObject<FaceBook>(json);

Fot Twitter,

GenericClass genericClass = JsonConvert.DeserializeObject<Twitter>(json);

и вы можете забыть, какой класс модели используется, и просто используйте GenericClass