Десериализовать объект с условием json.net - PullRequest
0 голосов
/ 27 ноября 2018

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

Например, саке, допустим, у меня есть опции "a" и "b":

{
  "Email": "james@example.com",
  "CreatedDate": "2013-01-20T00:00:00Z",
  "Roles": [{
    "name": "test",
    "type": "a",
    "town": "xyz"
  },
  {
    "name": "test1",
    "type": "b" 
  }]
}

Когда есть тип == b, тогда "town" может быть нулевым или mustnне будет виден, но когда тип == a, то город должен быть видимым.

Я устал от удаления полей, которые можно обнулять с сериализацией, но когда я пытаюсь десериализовать мою структуру классов, просто добавляет этот "город" к каждому элементу снулевое значение, которое ожидается, так как структура класса выглядит следующим образом.Как должна выглядеть структура класса?

1 Ответ

0 голосов
/ 27 ноября 2018

Вы можете передать флаг NullValueHandling атрибуту JsonProperty, если вы используете Newtonsoft.Вот пример в их документации:

https://www.newtonsoft.com/json/help/html/JsonPropertyPropertyLevelSetting.htm

Редактировать Попробуйте создать следующую структуру объекта:

public class Person
{
    public string Email { get; set; }
    public DateTime CreatedDate { get; set; }
    public List<Role> Roles { get; set; }
}

public class Role
{
    public string name { get; set; }
    public string type { get; set; }

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string town { get; set; }
}

Затем скопируйтеэтот json в файл и десериализовать вот так

string json = File.ReadAllText("a.json");
Person person = JsonConvert.DeserializeObject<Person>(json);

Редактировать

Что ж, если вы действительно вообще не хотите видеть это свойство, высобираюсь в конечном итоге с некрасивым кодом.Вот быстрый и грязный пример, который работает.

public class PersonA
{
    public string Email { get; set; }
    public DateTime CreatedDate { get; set; }
    public List<RoleB> Roles { get; set; }       
}

public class RoleB : RoleA
{
    public string town { get; set; }
}

public class PersonB
{
    public string Email { get; set; }
    public DateTime CreatedDate { get; set; }
    public List<RoleA> RolesA { get; set; } = new List<RoleA>();
    public List<RoleB> RolesB { get; set; } = new List<RoleB>();
}

public class RoleA
{
    public string name { get; set; }
    public string type { get; set; }
}

Затем сделайте что-то вроде этого:

string json = File.ReadAllText("a.json");
PersonA personA = JsonConvert.DeserializeObject<PersonA>(json);
PersonB personB = new PersonB() { Email = personA.Email, CreatedDate = personA.CreatedDate };

foreach(var role in personA.Roles)
{
    var roleB = role as RoleB;
    if (roleB.town != null)
    {
        personB.RolesB.Add(roleB);
    }
    else
    {
        personB.RolesA.Add(new RoleA() { name = roleB.name, type = roleB.type });
    }
}
...