0
votes

Newtonsoft désérialise Array en classe avec des propriétés

Consommer un service externe où ils ont décidé de fournir un objet sous forme de tableau où chaque propriété est à une position fixe. Comme

  {
    "persons" : [
        { 
             "FirstName" :  "Luck", 
             "LastName" : "Lucky", 
             "Age" : 28 
        },
        // ...
    ]
}

Je voudrais désérialiser ceci en une liste de personnes.

var persons =  JsonConvert.DeserializeObject<Person[]>(json);

class Person {
      public string FirstName {get; set; }
      public string LastName {get; set; }
      public int Age{get; set; }
}

Existe-t-il un moyen simple (annotation de propriété) de faire ceci, ou faut-il écrire un sérialiseur personnalisé?

Puisque la plupart des réponses manquent l'essence de la question.

Cela aurait été facile si

{
    "persons" : [
        ["Luck", "Lucky", 28],
        ["Joe", "Dalton", 30],
        ["Jack", "Dalton", 28],
        ["William", "Dalton", 26],
        ["Averell", "Dalton", 24]
    ]
}

Mais ce n'est pas le cas.


1 commentaires

Je suppose que vous avez mal copié votre exemple car ce n'est pas du JSON valide (les personnes doivent être des «personnes»).


7 Réponses :


1
votes

Vous pouvez le faire très facilement et simplement avec ceci:

PersonList personObject = new PersonList();


public class PersonList
{
    public List<Person> persons { get; set; }
}

public class Person
{
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public string Age{ get; set; }
}

personObject  = JsonConvert.DeserializeObject<PersonList>(YourResponseContent);

Ensuite, les éléments personObject auront les valeurs de la réponse.

La MainList doit avoir le même nom que votre élément dans la réponse. Ceci est important pour lire la réponse JSON .


3 commentaires

@JosefGinerman, j'ai édité ma réponse


échouera avec Impossible de désérialiser le tableau JSON actuel (par exemple [1,2,3]) dans le type 'Person' car le type nécessite un objet JSON (par exemple {"name": "value"}) pour désérialiser correctement.


Bonne solution, prenez un vote positif :-)



0
votes

Vous pouvez désérialiser la liste des objets en C #

var results=JsonConvert.DeserializeObject<List<Person>>(json);


0 commentaires

2
votes

La propriété

persons est un tableau de tableaux de chaînes. Essayez de désérialiser en List> d'abord

var root = JsonConvert.DeserializeObject<Root>(jsonString);
var persons = root.persons
    .Select(l => new Person { FirstName = l[0], LastName = l[1], Age = int.Parse(l[2]) })
    .ToList();

, puis convertissez-la en liste de List en utilisant Sélectionnez code > méthode

public class Root
{
    public List<List<string>> persons { get; set; }
}


3 commentaires

root ne sera pas un tableau de Person et ne répondra donc pas à la question.


@StijnVanAntwerpen J'ai ajouté un appel linq pour obtenir une liste de la classe Person


Hmm, vous le désérialiseriez tel quel, puis le mapperiez sur Person. Pas la question mais probablement une bonne solution.



0
votes

Que diriez-vous de

persons[0][0] = "Luck"

et

Root dsz = JsonConvert.DeserializeObject<Root>(sz);

Il sera désérialisé en liste de personnes que chaque personne aura une liste de vars. p>

public class Root
{
    public List<List<Object>> persons { get; set; }

}


0 commentaires

0
votes

Si j'ai bien compris votre question, vous pouvez faire quelque chose comme ça:

public class PersonObj
{
    public List<Person> persons {get;set;}
    public string FirstName { get { return persons.First(); }
    public string LastName { get { return return persons.Skip(1).First(); } }
}


0 commentaires

1
votes

Vous devriez créer un désérialiseur json personnalisé.

Essayez ceci:

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public int Age { get; set; }
}

 var deserializedRoot = JsonConvert.DeserializeObject<List<Person>>(yourJson, new PersonJsonConverter());

Et vous pouvez dersérialiser comme ceci:

public class PersonJsonConverter : JsonConverter
{
    public class RootJson
    {
        public List<List<string>> Persons { get; set; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var jsonObject = JObject.Load(reader);
        var root = JsonConvert.DeserializeObject<RootJson>(jsonObject.Root.ToString());

        var persons = root.Persons
            .Select(p => new Person { FirstName = p[0], LastName = p[1], Age = int.Parse(p[2]) })
            .ToList();

        return persons;
    }

    public override bool CanConvert(Type objectType)
    {
        return true;
    }
}


0 commentaires

0
votes
ParsedList list = Newtonsoft.Json.JsonConvert.DeserializeObject<ParsedList>(text);

            List<Person> people = list.persons.Select(x => new Person()

            {
                FirstName = x[0].ToString(),
                LastName = x[1].ToString(),
                Age = Convert.ToInt32(x[2])
            }
            
            ).ToList();

0 commentaires