2010-06-21 3 views
3

Je développe une application en C# qui peut contrôler un SqueezeboxServer (SBS). Communiquer à la SBS est par l'intermédiaire de messages JSON à http://serverIP:9000/jsonrpc.js Donc, j'envoie des messages JSON via un HTTPWepRequest et obtenir des réponses via une HTTPWebResponse.Comment extraire des informations d'un objet produit par JavaScriptSerializer

La réponse que je reçois est une chaîne en notation JSON. Et c'est là que les problèmes commencent ... Pour l'instant je convertis le message JSON en Object avec le JavaScriptSerializer. Cela va comme ceci:

public static Object FromJSON(this string reply) 
{ 
    JavaScriptSerializer deSerializer = new JavaScriptSerializer(); 
    return deSerializer.DeserializeObject(reply); 
} 

Ce code me donne un objet qui contient les données que je demande. Les données que je demande peuvent être très différentes. Parfois, la réponse est une réponse unique alors que dans d'autres situations, cela peut être multiple.

Considérons les deux images que j'ai inclus:

Le premier montre l'objet après qu'il a été renvoyé par le désérialiseur. Vous pouvez voir l'objet est un dictionnaire avec 4 paires clé-valeur. Le kvp qui m'intéresse est le 4ème. La clé "résultat" est celle qui contient les données dont j'ai besoin. Mais cette clé a un autre Dictonary comme valeur. Et cela continue encore et encore jusqu'à ce que les données réelles que je veux, qui est le nom de l'album et son ID.

alt text http://www.freeimagehosting.net/uploads/865397a19e.jpg

Dans la deuxième image les données que je veux est la valeur 0 qui appartient à la clé « _count ». Comme vous pouvez le voir, cet objet est moins compliqué.

alt text http://www.freeimagehosting.net/uploads/f6feb27ab5.jpg

Ainsi, la ligne de fond de ma question est de savoir comment puis-je faire une solution qui permet de récupérer les informations que je veux, mais travaille avec differt sortes d'objets (comme dans des profondeurs différentes)?

J'espère que n'importe qui peut m'envoyer dans la bonne direction.

Merci!

Répondre

0

Vous pouvez utiliser JavaScriptConverter pour obtenir un meilleur contrôle de l'expérience de désérialisation.

 using System; 
    using System.Collections.Generic; 
    using System.Collections.ObjectModel; 
    using System.Web.UI.WebControls; 
    using System.Collections; 

    namespace System.Web.Script.Serialization.CS 
    { 
     public class ListItemCollectionConverter : JavaScriptConverter 
     { 

      public override IEnumerable<Type> SupportedTypes 
      { 
       //Define the ListItemCollection as a supported type. 
       get { return new ReadOnlyCollection<Type>(new List<Type>(new Type[] { typeof(ListItemCollection) })); } 
      } 

      public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer) 
      { 
       ListItemCollection listType = obj as ListItemCollection; 

       if (listType != null) 
       { 
        // Create the representation. 
        Dictionary<string, object> result = new Dictionary<string, object>(); 
        ArrayList itemsList = new ArrayList(); 
        foreach (ListItem item in listType) 
        { 
         //Add each entry to the dictionary. 
         Dictionary<string, object> listDict = new Dictionary<string, object>(); 
         listDict.Add("Value", item.Value); 
         listDict.Add("Text", item.Text); 
         itemsList.Add(listDict); 
        } 
        result["List"] = itemsList; 

        return result; 
       } 
       return new Dictionary<string, object>(); 
      } 

      public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer) 
      { 
       if (dictionary == null) 
        throw new ArgumentNullException("dictionary"); 

       if (type == typeof(ListItemCollection)) 
       { 
        // Create the instance to deserialize into. 
        ListItemCollection list = new ListItemCollection(); 

        // Deserialize the ListItemCollection's items. 
        ArrayList itemsList = (ArrayList)dictionary["List"]; 
        for (int i=0; i<itemsList.Count; i++) 
         list.Add(serializer.ConvertToType<ListItem>(itemsList[i])); 

        return list; 
       } 
       return null; 
      } 

     } 
    } 

désérialiser Ensuite, il

var serializer = new JavaScriptSerializer(); 
serialzer.RegisterConverters(new[]{ new DataObjectJavaScriptConverter() }); 
var dataObj = serializer.Deserialize<DataObject>(json); 

JavaScriptSerializer.Deserialize - how to change field names

Questions connexes