2017-09-23 6 views
0

Je voudrais désérialiser quelques chaînes JSON comme ceci:JSON sous-classes délinéariser

{"time":1506174868,"pairs":{ 
    "AAA":{"books":8,"min":0.1,"max":1.0,"fee":0.01}, 
    "AAX":{"books":8,"min":0.1,"max":1.0,"fee":0.01}, 
    "AQA":{"books":8,"min":0.1,"max":1.0,"fee":0.01} 
    }} 

où AAA, AAX, ... il y a des centaines de variations

je colle cette JSON comme classe dans VS2017 et obtenir ce qui suit:

public class Rootobject 
{ 
    public int time { get; set; } 
    public Pairs pairs { get; set; } 
} 

public class Pairs 
{ 
    public AAA AAA { get; set; } 
    public AAX AAX { get; set; } 
    public AQA AQA { get; set; } 
} 

public class AAA 
{ 
    public int books { get; set; } 
    public float min { get; set; } 
    public float max { get; set; } 
    public float fee { get; set; } 
} 

public class AAX 
{ 
    public int books { get; set; } 
    public float min { get; set; } 
    public float max { get; set; } 
    public float fee { get; set; } 
} 

public class AQA 
{ 
    public int books { get; set; } 
    public float min { get; set; } 
    public float max { get; set; } 
    public float fee { get; set; } 
} 

Je vais essayer d'éviter des centaines de déclarations de classe étant donné que toutes les classes sont identiques, sauf leur nom.

J'ai essayé de sérialiser cela en tant que tableau ou liste, mais je reçois une exception car ce n'est pas un tableau.

J'utilise Newtonsoft JSON lib.

Merci

Répondre

1

Bien sûr, vous pouvez analyser la chaîne de JSON objet comme suit:

public class Rootobject 
{ 
    public int time { get; set; } 
    public Dictionary<string, ChildObject> pairs { get; set; } 
} 

public class ChildObject 
{ 

    public int books { get; set; } 
    public float min { get; set; } 
    public float max { get; set; } 
    public float fee { get; set; } 
} 

class Program 
{ 
    static string json = @" 
     {""time"":1506174868,""pairs"":{ 
     ""AAA"":{""books"":8,""min"":0.1,""max"":1.0,""fee"":0.01}, 
     ""AAX"":{""books"":8,""min"":0.1,""max"":1.0,""fee"":0.01}, 
     ""AQA"":{""books"":8,""min"":0.1,""max"":1.0,""fee"":0.01} 
     } 
    }"; 

    static void Main(string[] args) 
    { 
     Rootobject root = JsonConvert.DeserializeObject<Rootobject>(json); 
     foreach(var child in root.pairs) 
     { 
      Console.WriteLine(string.Format("Key: {0}, books:{1},min:{2},max:{3},fee:{4}", 
       child.Key, child.Value.books, child.Value.max, child.Value.min, child.Value.fee)); 
     } 

    } 
+0

Oui, il a résolu mon problème. Merci beaucoup – hkhk

+0

Vous êtes les bienvenus :) – uyquoc

0

réponse de thisextendsthat est très bien pour votre cas. Cependant, il y a des options dynamiques entièrement pour désérialisation:

1) Parse dans un JToken

var root = JObject.Parse(jsonString); 
var time = root["time"]; 

2) Parse dans un dynamic

dynamic d = JObject.Parse(jsonString); 
var time = d.time; 
+0

J'ai essayé la version dynamique et cela fonctionne aussi, merci. Une question de plus: comment puis-je obtenir des «livres» d'un objet enfant? La clé (AAA, AAX) peut être n'importe quoi, je ne sais pas lequel est présent dans la réponse – hkhk