6

WCF でいくつかのクラス (データ コントラクトとサービス コントラクト) を作成しましたが、JSON でシリアル化および逆シリアル化しようとしています。次の JSON 構造が必要な場合、DataContract を作成するにはどうすればよいですか。

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

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

4

3 に答える 3

12

探している完全なオブジェクトは、次のように構成されている必要があります。

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

{およびで示されるように、オブジェクト階層を設定する必要があります。また、目的の JSON 出力からおよび}で示されるように、IEnumerable / 配列プロパティも設定する必要があります。[]

簡単な例がないため、このサイトはわかりにくいかもしれませんが、構文の基本的な理解については、JSON の紹介を参照してください。私が思いついたもう 1 つの良いサイトは、いくつかの簡単な例だけでしたが、ASP.NET Web API での JSON と XML のシリアル化です。

vittore によるいくつかのガイダンスのおかげで、JSON 出力と完全に一致するものを作成するには、次のようなオブジェクトが必要になることに気付きました。

[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 の予想される出力を変更できる立場にある場合は、最初のブロックを使用し、2 つのId列をint型にするという追加の変更を行います。

これらの型は、 JSON を返すための WCF サービスでのセットアップと同様のサービスをサポートするために作成され、次のコードを使用してテストされました。

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

DataContractJsonSerializerの詳細

また、RESTful Web サービスをセットアップするオプションがある場合は、How to create a JSON WCF RESTful Service in 60 secondsのガイドラインに従うことができます。

于 2013-03-13T19:33:34.953 に答える
3

http://json.codeplex.com/にアクセスしてください。使用する

JsonConvert.SerializeObject()

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

JsonConvert.PopulateObject

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

于 2013-03-13T19:00:47.027 に答える