2013-03-13 23 views
5

私はWCFにいくつかのクラス(データコントラクトとサービスコントラクト)を書いています。私はJSONでシリアライズしてデシリアライズしようとしています。私は次のようなJSON構造が必要な場合は、どのように私はのDataContract(複数可)を作成します。WCF - JSONでシリアライズおよびデシリアライズする方法は?

{ 
    "response": { 
    "locations": { 
     "location": [ 
     { 
      "id": "12", 
      "name": "Hello", 
      "statusid": "78" 
     }, 
     { 
      "id": "5", 
      "name": "Ann", 
      "statusid": "8" 
     } 
     ] 
    }, 
    "error": "404 error" 
    } 
} 

上記の構造はかなりまっすぐ進むと、前述したように、いくつかの場所の詳細することができそこの場所の下に。ですから、私は配列/リストを下記のように "場所"のデータメンバーに取得する必要があります。現時点では、私は以下のDataContractのみを持っています:

[DataContract] 
    public class Response 
    { 
     [DataMember] 
     public string locations { get; set; } 

     [DataMember] 
     public string error{ get; set; } 
    } 

私はこれを解決する方法を教えてください。

答えて

3

http://json.codeplex.com/をご覧ください。

JsonConvert.SerializeObject() 

を使用してオブジェクトをJSON文字列に変換します。

JsonConvert.PopulateObject 

を使用してJSON文字列をオブジェクトに変換します。 IEnumerableを/アレイのプロパティが示されているように、{}で示される、などのようにあなたは、セットアップにオブジェクト階層を必要とする

[DataContract(Name="response")] 
public class Response 
{ 
    [DataMember(Name = "locations")] 
    public IEnumerable<Location> Locations { get; set; } 

    [DataMember(Name = "error")] 
    public string Error { get; set; } 
} 

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

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

    [DataMember(Name = "statusid")] 
    public string StatusId { get; set; } 
} 

:あなたが探している

10

完全なオブジェクトは、として構成する必要があります希望のJSON出力の[]で指定します。

単純な例がないので、このサイトは混乱する可能性がありますが、構文の基本的な理解についてはIntroducing JSONを参照してください。私が訪れたもう一つの良いサイトは、単純な例だけで、JSON and XML Serialization in ASP.NET Web APIでした。

[DataContract] 
public class ResponseParent 
{ 
    [DataMember(Name = "response")] 
    public Response ResponseInstance { get; set; } 
} 

[DataContract] 
public class Response 
{ 
    [DataMember(Name = "locations")] 
    public LocationCollectionIntermediate Locations { get; set; } 

    [DataMember(Name = "error")] 
    public string Error { get; set; } 
} 

[DataContract] 
public class LocationCollectionIntermediate 
{ 
    [DataMember(Name = "location")] 
    public IEnumerable<Location> Locations { get; set; } 
} 

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

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

    [DataMember(Name = "statusid")] 
    public string StatusId { get; set; } 
} 

私はので、ここでは2番目のコードブロックにこれらを追加しました:ヴィットーレによっていくつかのガイダンスに

おかげで、私は次のようなオブジェクトが必要になり、あなたのJSON出力に正確に一致を構築することに気づきましたそのような構造は不必要に複雑に思われる。しかし、JSONの予想される出力を変更できる位置にいる場合は、最初のブロックに進み、2つのId列をintタイプに変更するという追加の変更を行います。

これらのタイプはWCF Service to return JSONでセットアップなどと同様のサービスをサポートするために作成し、次のコード使用して試験した:あなたは、セットアップのオプションを持っている場合ということもDataContractJsonSerializer

string json; 
using (var ms = new MemoryStream()) 
{ 
    var ser = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(ResponseParent)); 
    ser.WriteObject(ms, r); 
    json = System.Text.Encoding.UTF8.GetString(ms.GetBuffer(), 0, Convert.ToInt32(ms.Length)); 
} 

詳細RESTful Webサービスの場合は、How to create a JSON WCF RESTful Service in 60 secondsのガイドラインに従うことができます。

+1

私はむしろC#のcoddingの基準に従って適切に(すなわち場所ではない場所)をクラスとプロパティに名前を付け、データメンバーにヒントを使用するなど、すなわち '[データメンバーを(属性publicクラスLocation' – vittore

+0

もう一つの話は、どちらのトピックスターターにもjsonペイロードの例でエラーがあることに気づいたか、または 'location'プロパティを持つオブジェクト' locations'を持っているので別のクラスを導入する必要があります。これは何かの配列です(あなたのC#スニペットで 'location'オブジェクトと呼んでいたもののようです) – vittore

+0

助けてくれてありがとうございます。マイク、あなたは上記の構造をどのようなシリアライズ方法を実装している? .NETのシリアル化またはJSON.NET?私はそれがネイティブのシリアル化を使用して行うことができるかどうか疑問に思っていたので。 –

3

正確な帰属構造を取得したら、JavaScriptSerializerクラスをSystem.Web.Script.Serialization(.NET 3以降)から使用することもできます。5)このような

何かが動作します:

string jsonString; 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
Response responseObject = serializer.Deserialize<Response>(jsonString); 

私はその注意点について完全にはよく分からないが、DataContractSerializerを使用するよりもさらに簡単。私は何度も何も問題なく使用しました。

JavaScriptConverterを追加して、a nicer way of dynamic JSON parsingを比較的簡単に実装することもできます。

ダイナミック解析はまた、この方法は非常に簡単です:

string jsonString; 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
dynamic responseObject = serializer.Deserialize<object>(jsonString); 

responseObject["locations"] = ... 
関連する問題