2011-07-03 2 views
1

J'essayais d'implémenter l'analyse d'une réponse JSON comme indiqué here pour mon projet Windows Phone 7 en C#. Mais je suis coincé avec une erreur de compilation comme "Le type ou nom d'espace de noms 'Serializable' n'a pas pu être trouvé (vous manque une directive using ou une référence d'assembly?)"Json Sérialisation pour Windows Phone

J'ai les importations en utilisant System.Runtime.Serialization ; en utilisant System.Runtime.Serialization.Json; Je ne suis pas sûr de ce que l'importation me manque. J'ai essayé d'inclure en utilisant System.ServiceModel.Web; Mais la partie Web n'est pas reconnue.

Je pensais que mon projet ne pointait pas sur le bon cadre de here. Mais dans les informations de l'Assemblée, il n'y a pas d'option pour moi de changer le cadre cible.

This ressemble à un problème similaire à la mienne, mais je ne pouvais pas trouver le JSON.NET dans. NET dll qui est filtré pour Windows Phone.

que quelqu'un peut me aider à obtenir cette chose JSON de travail pour Windows Phone 7.

Merci à l'avance.

EDIT - 7/3/11

réponse Mon Jason est { "serviceResponse": { "servicename": "RequestRegisterUser", .....

Et mes objets de réponse sont :

[DataContract] 
     public class serviceresponse 
     { 
      [DataMember] 
      public String servicename { get; set; } 
      . 
      . 
      . 

Et ma méthode Désérialiser:

public static T Deserialise<T>(string json) 
    { 
     T obj = Activator.CreateInstance<T>(); 
     using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
     { 
      DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); 
      obj = (T)serializer.ReadObject(stream); 
      return obj; 
     } 
    } 

Maintenant, je reçois cette erreur après désérialisation la réponse: servicename ne pouvait pas évaluer chaîne d'expression

(je ne pouvais pas importer System.ServiceModel.Web si je le dll dans la référence. Une erreur de compilation de la part .Web (Le nom du type ou espace de noms « Web » n'existe pas dans l'espace de noms « System.ServiceModel »))

EDIT Après plus de recherche, j'ai trouvé ma réponse vu dans le débogueur est en fait { \ "serviceresponse \": { \ "nom_service \": \ "RequestRegisterUser \", ..... J'ai cherché pour cela et j'ai trouvé que cela pourrait être un problème. Comment puis-je le formater pour corriger la chaîne JSON ??

+2

Pourriez-vous poster le code qui ne compile pas? –

Répondre

0

J'ai trouvé le problème. Bien que mon nom de classe est « serviceResponse », je une autre classe wrapper comme

public class Response 
{ 
    public serviceresponse serviceres;//Don't Do this.... 
} 

où je le nom de la variable pour serviceResponse comme serviceres. Mais quand je l'ai changé pour "serviceresponse" tout fonctionne.

public class Response 
{ 
    public serviceresponse serviceresponse;//This fixed it. 
} 
1

Il serait certainement utile si vous avez posté votre code. Donc, je ne peux que deviner:

Je suppose que vous avez quelque chose comme ceci:

[Serializable] 
public class Response 
{ 
    [DataMember] 
    public string name { get; set; } 
    ... 
} 

Mais c'est un méli-mélo de deux concepts de sérialisation, dont un est pas pris en charge dans le téléphone 7. Les attributs corrects sont DataContract et DataMember:

[DataContract] 
public class Response 
{ 
    [DataMember] 
    public string name { get; set; } 
    ... 
} 
+0

Merci. Maintenant, j'ai ajouté mon code source, ce qui est similaire à votre réponse. Pouvez-vous prendre une autre photo maintenant? – franklins

3

Vous devez ajouter une référence aux deux ensembles de System.Runtime.Serialization et System.ServiceModel.Web.Le DataContractJsonSerializer est défini dans l'assembly System.ServiceModel.Web dans la version Silverlight du framework, c'est pourquoi vous avez besoin de la référence d'assembly supplémentaire. Et en passant, JSON.NET est un framework JSON open-source populaire pour .Net et vous pouvez en trouver plus à ce sujet here. Cela ne fait pas partie du framework .Net, c'est pourquoi vous ne pouvez pas le trouver.

Edit:

  1. A propos de la compilation, dans Silverlight est le DataContractJsonSerializer dans l'espace de noms System.Runtime.Serialization.Json, mais dans le System.ServiceModel.Web de montage (en System.ServiceModel.Web.dll), qui est un peu déroutant. Donc, vous l'utilisez comme ceci - System.Runtime.Serialization.Json.DataContractJsonSerializer, mais vous avez besoin de la référence d'assemblage supplémentaire. Vous devez également référencer l'assembly System.Runtime.Serialization, car c'est là que l'attribut DataContract est défini. Je vois que vous avez déjà compilé le code avec succès, mais j'espère que l'explication supplémentaire le rendra plus clair pour les futurs lecteurs.
  2. À propos de la sérialisation elle-même - comme vous l'avez déjà découvert, vous aurez besoin de deux objets, simplement parce que c'est la structure de la json. Toutefois, les attributs DataContract et DataMember ont une propriété Name que vous pouvez utiliser au lieu de modifier le nom des champs. En outre, vous pouvez utiliser des propriétés au lieu de champs si vous le souhaitez.

Par exemple:

[DataContract] 
public class ServiceResponse 
{ 
    [DataMember(Name = "servicename")] 
    public string ServiceName { get; set; } 
} 

[DataContract] 
class Response 
{ 
    [DataMember(Name = "serviceresponse")] 
    public ServiceResponse ServiceResponse { get; set; } 
} 

Et une dernière chose - vous n'avez pas besoin de l'appel à Activator.CreateInstance(); dans votre méthode Deserialise.

+0

Merci. Cela explique à propos de Json.net. J'ai posté mon code source. Je ne pouvais pas importer System.ServiceModel.Web bien que j'ai la DLL dans la référence. Une erreur de compilation sur la partie .Web (Le type ou le nom de l'espace de noms 'Web' n'existe pas dans l'espace de noms 'System.ServiceModel') – franklins