2016-02-25 1 views
-2

J'essaie de désérialiser un objet json. Cela fonctionne bien jusqu'à un certain point. J'ai un objet Area, qui contient un tableau d'objets Zone.Désérialise le tableau JSON dans la liste

{ 
    "Area":{ 
    "id": "0", 
    "type": "area", 
    "size": { 
     "x": 4.5, 
     "y": 4.5, 
     "z": 4.5 
    }, 
    "position": { 
     "x": 0, 
     "y": 0, 
     "z": 0 
    }, 
    "rotation": { 
     "x": 0, 
     "y": 0, 
     "z": 0 
    }, 
    "zones": [ 
     { 
     "id": "001", 
     "type": "zone", 
     "size": { 
      "x": 1, 
      "y": 1, 
      "z": 1 
     }, 
     "position": { 
      "x": 1, 
      "y": 0, 
      "z": 1 
     }, 
     "rotation": { 
      "x": 0, 
      "y": 0, 
      "z": 0 
     } 
     }, 
     { 
     "id": "002", 
     "type": "zone", 
     "size": { 
      "x": 1, 
      "y": 1, 
      "z": 1 
     }, 
     "position": { 
      "x": 3, 
      "y": 0, 
      "z": 1 
     }, 
     "rotation": { 
      "x": 0, 
      "y": 0, 
      "z": 0 
     } 
     } 
    ] 
    } 
} 

Le type Area désérialise bien, cependant, je voudrais que le tableau de la zone désérialiser à un List<Zone>. Comment puis-je atteindre cet objectif?

string jsonString = r.ReadToEnd(); 
JavaScriptSerializer jss = new JavaScriptSerializer(); 
Area area = jss.Deserialize<Area>(jsonString); 

public class Area : AirObject3D 
{ 
    public List<Zone> zones; 
    public List<TouchPoint> touchPoints; 
    public Area() 
    { 
     this.size.X = 4.5; 
     this.size.Z = 4.5; 
    } 
} 
+0

Vous voulez désérialiser à une autre liste? Ou à la liste qui est dans la classe 'Area'? – pwas

+3

Mettez simplement une propriété 'zones' de type' List 'dans le type' Area'. – poke

+1

Modifier la propriété 'Zones' de la classe' Area' de 'Zone []' à la liste '? – CodeCaster

Répondre

0

Il vous suffit de configurer votre contrat correctement. Pour désérialiser une liste, vous pouvez simplement définir le type de propriété sur List<Zone> (vous pouvez également désérialiser dans un tableau en utilisant Zone[]).

Votre contrat pourrait par exemple ressembler à ceci:

public class Root 
{ 
    public Area Area { get; set; } 
} 
public class Area 
{ 
    [XmlElement("id")] 
    public string Id { get; set; } 
    [XmlElement("type")] 
    public string Type { get; set; } 
    [XmlElement("size")] 
    public Coordinate Size { get; set; } 
    [XmlElement("position")] 
    public Coordinate Position { get; set; } 
    [XmlElement("rotation")] 
    public Coordinate Rotation { get; set; } 
    [XmlElement("zones")] 
    public List<Zone> Zones { get; set; } 
} 
public class Zone 
{ 
    [XmlElement("id")] 
    public string Id { get; set; } 
    [XmlElement("type")] 
    public string Type { get; set; } 
    [XmlElement("size")] 
    public Coordinate Size { get; set; } 
    [XmlElement("position")] 
    public Coordinate Position { get; set; } 
    [XmlElement("rotation")] 
    public Coordinate Rotation { get; set; } 
} 
public class Coordinate 
{ 
    [XmlElement("x")] 
    public float X { get; set; } 
    [XmlElement("y")] 
    public float Y { get; set; } 
    [XmlElement("z")] 
    public float Z { get; set; } 
} 

Notez l'utilisation du XmlElementAttribute pour faire en sorte que les propriétés minuscules sont correctement désérialisé dans les propriétés capitalisées C# (puisque les propriétés devraient être capitalisées par convention).

Utilisé comme celui-ci sur vos données, il remplit correctement tous les objets:

JavaScriptSerializer jss = new JavaScriptSerializer(); 
Root root = jss.Deserialize<Root>(jsonString); 
+0

Oui, si je capitaliser dans le json, pourrais-je perdre les defs XMLElement? –

+0

Oui, si les propriétés dans le JSON correspondent aux noms de propriété dans la classe, vous pouvez le laisser dehors (comme je l'ai fait dans la classe 'Root') – poke

+0

C'est super, merci poke :-) –

-6

votre objet graphique devrait ressembler -

public class Size 
{ 
    public double x { get; set; } 
    public double y { get; set; } 
    public double z { get; set; } 
} 

public class Position 
{ 
    public int x { get; set; } 
    public int y { get; set; } 
    public int z { get; set; } 
} 

public class Rotation 
{ 
    public int x { get; set; } 
    public int y { get; set; } 
    public int z { get; set; } 
} 

public class Zone 
{ 
    public string id { get; set; } 
    public string type { get; set; } 
    public Size size { get; set; } 
    public Position position { get; set; } 
    public Rotation rotation { get; set; } 
} 

public class Area 
{ 
    public string id { get; set; } 
    public string type { get; set; } 
    public Size size { get; set; } 
    public Position position { get; set; } 
    public Rotation rotation { get; set; } 
    public List<Zone> zones { get; set; } 
} 

public class RootObject 
{ 
    public Area Area { get; set; } 
} 

var o = JsonConvert.DeserializeObject<RootObject>("json"); 
+2

Ceci est une déclaration générale et pas spécifique à la question du PO du tout. – CodeCaster

+1

plus d'une copie passée de json2csharp.com –

+1

l'autre réponse n'a pas été versée en bas. : (\ –