2016-08-25 1 views
0

je le JSON suivant:serialise JSON à C objet # en ArrayList d'objets

{ 
    "id": "3cf5373c-9181-4639-89f0-bb64b387f961", 
    "display": "Data 1", 
    "country": "AU" 
    } 

et je sais comment construire la classe à sérialiser:

[DataContract] 
public class myJSONClass 
{ 

    [DataMember(Name = "id")] 
    public string Id { get; set; } 

    [DataMember(Name = "display")] 
    public string Display { get; set; } 

    [DataMember(Name = "country")] 
    public string Country { get; set; } 
} 

et j'utiliser ci-dessous pour sérialisation:

 var url = "http://myJSONAPI/"; 

     var syncClient = new WebClient(); 
     var content = syncClient.DownloadString(url); 

     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(myJSONClass)); 
     using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(content))) 
     { 
      var jsonData = (myJSONClass)serializer.ReadObject(ms); 
     } 

Mais comment pourrais-je aller sur la définition de ma classe si mon JSON est comme ci-dessous?

[ 
    { 
    "id": "3cf5373c-9181-4639-89f0-bb64b387f961", 
    "display": "My Data 1", 
    "country": "AU" 
    }, 
    { 
    "id": "8886d2c8-0fd5-49ff-a3e1-7cef9e654514", 
    "display": "no test", 
    "country": null 
    } 
] 

Comment souhaitez-vous déclarer ma classe?

Et comment puis-je le sérialiser? Je ne peux pas utiliser JSON.net car je ne peux pas utiliser un framework .Net plus récent.

Répondre

2

[] - C'est un tableau. Donc, après désérialisation vous devriez obtenir seul objet de tableau de votre classe (myJSONClass)

myJSONClass[] deserializedData=deserialize(jsonData); 

Donc, si vous voulez obtenir un tableau désérialisé d'objets, vous devez simplement sérialisation pas un seul objet, mais un tableau (plusieurs objets de votre classe Mais vous faites quelque chose d'étrange dans l'exemple parce que vous avez téléchargé une chaîne et essayé de sérialiser. Mais vous avez reçu des données sérialisées (la chaîne est sérialisée, l'objet peut être créé en désérialisant une chaîne json (ou xml)).

Donc, si vous avez réellement reçu 2 objets dans le tableau (comme dans votre dernier échantillon JSON) votre code devrait être plus comme ceci:

var url = "http://myJSONAPI/"; 
    var syncClient = new WebClient(); 
    var content = syncClient.DownloadString(url); 

    DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(myJSONClass[])); 
    using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(content))) 
    { 
     myJSONClass[] jsonObject = (myJSONClass[])serializer.ReadObject(ms); 
    } 

Je rebaptisés certaines variables pour une meilleure compréhension. Aussi maintenant vous désérialisez le tableau de votre classe.

J'ai aussi trouvé ce fil: Deserialization of array with DataContractJsonSerializer with Windows Store App

Mais mon conseil est de regarder NewtonsoftJSON. Il est vraiment doux http://www.newtonsoft.com/json/help/html/deserializeobject.htm Alors vous pourriez obtenir le jus de tout par une ligne:

myJSONClass[] res = JsonConvert.DeserializeObject<myJSONClass[]>(json_string); 
+0

merci beaucoup @dmitry, ça marche parfaitement. En plus j'adorerais utiliser NewtonsoftJSON, mais c'est l'un de nos systèmes hérités qui ne peuvent pas aller jusqu'à .Net plus récent. ; ( –

1

Vous pouvez faire un peu:

// Use for JavaScriptSerializer 
using System.Web.Script.Serialization; 
JavaScriptSerializer serializer = new JavaScriptSerializer(); 
List<myJSONClass> myList = serializer.Deserialize<List<myJSONClass>>(content); 

// Use for JsonConvert 
using Newtonsoft.Json; 
List<myJSONClass> myList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<myJSONClass>>(content); 

Hope this aide!

+0

la ligne simple C# fonctionne comme un rêve pour moi grâce – Wazzie