2010-02-16 6 views
4

J'ai des problèmes pour désérialiser certaines données json, obtenir InvalidCastExceptions et autres.Désérialisation d'un tableau json dans la classe .net

Quelqu'un peut-il me diriger dans la bonne direction?

Voici le json que je veux désérialiser;

[{ "OrderId": 0, "Nom": "Résumé", "MaxLen": "200"}, { "OrderId": 1, "Nom": "Détails", "MaxLen": "0"}]

Voici mon code;

Public Class jsTextArea 
    Public OrderId As Integer 
    Public Name As String 
    Public MaxLen As String 
    End Class 

Dim js As New System.Web.Script.Serialization.JavaScriptSerializer 
Dim rawdata = js.DeserializeObject(textAreaJson) 
Dim lstTextAreas As List(Of jsTextArea) = CType(rawdata, List(Of jsTextArea)) 

Répondre

5

OrderId est Int dans votre JSON (notez l'absence fo guillemets autour des valeurs), mais vous déclarer comme chaîne dans « jsTextArea ». En outre, à moins que le type rawdata ne soit retourné à List (Of jsTextArea), le code que vous avez montré ne fonctionnera probablement pas.

Mise à jour Pour obtenir les données sur dans une liste (de jsTextArea) les opérations suivantes:

Dim js As New System.Web.Script.Serialization.JavaScriptSerializer 
    Dim lstTextAreas = js.Deserialize(Of List(Of jsTextArea))(textAreaJson) 
+1

@GordonB, voir à jour que je viens d'ajouter. Le code fonctionne pour moi :) Il semble aussi gérer la conversion de int en chaîne entre le json et votre classe :) – Rob

+0

Ah, ok .... Je viens de trouver que l'utilisation de la méthode de désérialisation droite a travaillé ... Wa essayant de diviser en plusieurs lignes pour voir où l'erreur se produisait, mais cela n'a pas aidé :) Je vais vous donner la réponse, car vous me battre probablement de quelques secondes ..... Cheers. – GordonB

2

Le faire sur une seule ligne a travaillé un régal;

Dim lstTextAreas As List(Of jsTextArea) = js.Deserialize(textAreaJson, GetType(List(Of jsTextArea))) 
+1

Travaillant principalement en C# (donc en utilisant var pour le typage implicite des variables), ma version de la ligne semble "plus propre", mais ils vont compiler jusqu'à la même IL et faire exactement la même chose sans aucun doute! :) – Rob

+0

Yah, deux routes ... même résultat, quoique moins verbeux que le mien. Salutations pour votre aide :) – GordonB

0
Dim textAreaJson As String = "[{""OrderId"":0,""Name"":""Summary"",""MaxLen"":""200""},{""OrderId"":1,""Name"":""Details"",""MaxLen"":""0""}]" 
Dim js As New System.Web.Script.Serialization.JavaScriptSerializer 
Dim lstTextAreas As jsTextArea() = js.Deserialize(Of jsTextArea())(textAreaJson) 
0

est ici une fonction à Désérialise JSON de tout type:

Public Function DeserializeJson(Of T)(json As String) As T 
     Return New JavaScriptSerializer().Deserialize(Of T)(json) 
    End Function 
Questions connexes