2011-07-03 6 views
1

私のWindows Phone 7プロジェクトのC#でhereのようにJSONレスポンスの解析を実装しようとしていました。しかし、コンパイルエラーが発生しました。「型または名前空間の名前 'Serializable'が見つかりませんでした(使用するディレクティブまたはアセンブリ参照がありませんか?)」Windows Phone用のJsonシリアライズ

私はSystem.Runtime.Serialization ; using System.Runtime.Serialization.Json;私は何が輸入されているのか分からない。私はSystem.ServiceModel.Webを使ってインクルードしようとしました。しかし、Webパーツは認識されません。

私のプロジェクトは正しいフレームワークを指していないと思ったhere。しかし、Assembly情報には、私がターゲットフレームワークを変更するオプションはありません。

This私の場合と同様の問題ですが、Windows Phoneでフィルタリングされた.net dllでJSON.NETを見つけることができませんでした。

誰かがこのJSONの事は、事前にWindowsの電話7

感謝のために働いて得るために私を助けることができます。

EDIT - 7/3/11

マイジェイソン応答が { "serviceresponse" です:{ "サービス名": "RequestRegisterUser"、.....

そして、私のレスポンスオブジェクトであります:

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

そして、私の逆シリアル化の方法:

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; 
     } 
    } 

は今、私は応答をデシリアライズした後に、このエラーを取得しています: サービス名は、式の文字列

を評価することができませんでした(私は参照でDLLを持っているのに、私はSystem.ServiceModel.Webをインポートすることができませんでした。 .Web部にコンパイルエラー(型または名前空間名「ウェブ」は、名前空間に存在しない「System.ServiceModel」))

EDITデバッガで見たときより多くの研究の後、私は私の応答を見つけました \ "RequestRegisterUser \"、\ "RequestRegisterUser \"、..... これを検索した結果、問題が発生している可能性があります。 JSON文字列を修正するにはどうすればいいですか?

+2

コンパイルしていないコードを投稿できますか? –

答えて

0

問題が見つかりました。私のクラス名が「serviceresponse」ですが、私はserviceresとしてserviceresponseのための変数名を使用

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

として別のラッパークラスを使用していました。しかし、私はそれをすべて "サービス応答"に変更しました。

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

あなたがコードを投稿した場合は確かに役に立ちます。だから私は唯一の推測することができます。

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

しかし、それは7正しい属性である電話での1がサポートされていない2つのシリアル化の概念、の取り違えです:

を私はあなたがこのような何かを持っていると仮定しますのDataContractデータメンバー

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

ありがとうございます。今すぐ私のソースコードを追加しました。あなたの応答に似ています。今すぐ別のショットを撮ることができますか? – franklins

3

あなたはSystem.Runtime.SerializationとSystem.ServiceModel.Webアセンブリの両方への参照を追加する必要があります。DataContractJsonSerializerは、SilverlightバージョンのフレームワークのSystem.ServiceModel.Webアセンブリで定義されているため、余分なアセンブリ参照が必要です。

JSON.NETは.NET用のオープンソースのJSONフレームワークとして人気があり、その詳細についてはhereをご覧ください。それは.Netフレームワークの一部ではないので、それを見つけることができません。

編集:コンパイルについて

  1. 、SilverlightでDataContractJsonSerializerがある、System.Runtime.Serialization.Json名前空間ではなく、(System.ServiceModel.Web.dll中)組立System.ServiceModel.Webであります少し紛らわしい。だから、このように使用する - System.Runtime.Serialization.Json.DataContractJsonSerializerが、余分なアセンブリの参照が必要です。 DataContract属性が定義されているため、System.Runtime.Serializationアセンブリも参照する必要があります。すでにコードを正常にコンパイルしていることがわかりますが、余分な説明が将来の読者にとってより明確になることを願っています。
  2. シリアライゼーション自体について - あなたがすでに知っているように、2つのオブジェクトが必要です。なぜなら、それがjsonの構造だからです。ただし、DataContractおよびDataMember属性は、フィールドの名前を変更する代わりに使用できるNameプロパティを持っています。また、必要に応じてフィールドの代わりにプロパティを使用することもできます。たとえば、

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

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

そして最後に一つ - あなたはActivator.CreateInstance(への呼び出しは必要ありません)。あなたのDeserialiseメソッドで

+0

ありがとうございます。それはJson.netについての説明です。私は自分のソースコードを掲載しました。私はSystem.ServiceModel.Webをインポートできませんでしたが、私は参照にdllを持っています。 .Web部分のコンパイルエラー(型または名前空間の名前 'Web'が名前空間 'System.ServiceModel'に存在しません) – franklins