web-dev-qa-db-fra.com

Désérialiser JSON avec des objets dynamiques

J'ai un objet JSON qui vient avec une longue liste d'indicatifs régionaux. Malheureusement, chaque indicatif régional correspond au nom de l'objet figurant sur une liste de l'objet Data. Comment créer une classe qui permettra à RestSharp de désérialiser le contenu?

Voici à quoi ressemble ma classe maintenant:

public class phaxioResponse
{
    public string success { get; set; }
    public string message { get; set; }
    public List<areaCode> data { get; set; }

    public class areaCode
    {
        public string city { get; set; }
        public string state { get; set; }
    }
}

Et voici le contenu JSON:

{
    success: true
    message: "277 area codes available."
    data: {
        201: {
            city: "Bayonne, Jersey City, Union City"
            state: "New Jersey"
        }
        202: {
            city: "Washington"
        state: "District Of Columbia"
        } [...]
}
10
PeteFox

Comme ce JSON n’est pas compatible avec C #, j’ai dû faire un peu de hackery pour le faire sortir correctement. Cependant, le résultat est assez sympa.

var json = JsonConvert.DeserializeObject<dynamic>(sampleJson);
var data = ((JObject)json.data).Children();
var stuff = data.Select(x => new { AreaCode = x.Path.Split('.')[1], City = x.First()["city"], State = x.Last()["state"] });

Ce code générera un type anonyme qui représente le mieux les données. Cependant, le type anonyme pourrait facilement être remplacé par un ctor pour une classe DTO plus normale.

La sortie ressemble à ceci:

Deserialization Output

17
Pete Garafano

votre json est incorrect, mais si vous le corrigez, vous pouvez utiliser un outil json-to-csharp comme celui sur http://json2csharp.com/ pour générer vos classes:

public class __invalid_type__201
{
    public string city { get; set; }
    public string state { get; set; }
}

public class Data
{
    public __invalid_type__201 __invalid_name__201 { get; set; }
}

public class RootObject
{
    public bool success { get; set; }
    public string message { get; set; }
    public Data data { get; set; }
}
3
Zdravko Danev

Je ne connais rien à RestSharp, mais si vous utilisez Newtonsoft côté serveur, vous pouvez simplement passer un JObject à votre méthode. Ensuite, vous pouvez interroger l'objet pour voir quel type d'objet il s'agit réellement et utiliser JObject.ToObject () pour le convertir.

0
Ash8087

Je pense que Dictionary<int,areaCode> est le moyen le plus simple.

public class phaxioResponse
    {
        public string success { get; set; }
        public string message { get; set; }
        public Dictionary<int,areaCode> data { get; set; }

        public class areaCode
        {
            public string city { get; set; }
            public string state { get; set; }
        }
    }

Ensuite:

    var res= JsonConvert.DeserializeObject<phaxioResponse>(json);
    Console.WriteLine(string.Join(",", res.data));
0
MistyK