4

JSON データを返す Web サービスを使用しています。多くの場合、サービスは、C# 側のクラスにグループ化したい 1 つのオブジェクトで複数のプロパティを返します。次のようなクラス構造を考えてみましょう:

  class Person
  {
      public Address Address { get; set; }
      public string Name {  get; set; }
  }

  class Address
  {
      public string StreetAddress { get; set; }
      public string City {  get; set; }
      public string ZipCode {  get; set; }
  }

JSON データは次のようになります。

{ "Name" : "Pilchie",
"StreetAddress" : "1234 Random St",
"City" : "Nowheretown",
"Zip" : "12345"
}

Personmyとクラスを属性にしてAddress、この形式にシリアライズ/デシリアライズすることはできますか?

4

4 に答える 4

3

JSON.NETですべてを一度に実行できるとは思いません。Personオブジェクトを手動で作成する必要があります。ただし、個別のDTOクラスを作成せずにそれを行うことができます。例えば:

var jsonText = "{ \"Name\" : \"Pilchie\"," +
            "\"StreetAddress\" : \"1234 Random St\"," +
            "\"City\" : \"Nowheretown\"," +
            "\"Zip\" : \"12345\"" +
            "}";
JObject jsonObject = (JObject) JsonConvert.DeserializeObject(jsonText);

var person =
    new Person
    {
        Address = new Address
                    {
                    City = (String) jsonObject["City"],
                    StreetAddress = (String) jsonObject["StreetAddress"],
                    ZipCode = (string) jsonObject["Zip"]
                    },
        Name = (string) jsonObject["Name"]
    };

そしてシリアル化:

JsonConvert.SerializeObject(
    new
    {
        person.Name,
        person.Address.StreetAddress,
        person.Address.City,
        Zip = person.Address.ZipCode
    });
于 2012-07-20T17:04:22.433 に答える
0

消費しているデータを逆シリアル化する最も簡単な方法は、JSON データの形式に一致する単純な DTO オブジェクトを作成することだと思います。その後、AutoMapper または同様のライブラリを使用して、データを新しい構造に簡単にマップできます。

于 2012-07-20T16:15:17.453 に答える
0

それはすべて、データをどのように使用するかによって異なります。アドレスプロパティにアクセスしたいだけなら、次のようにすることができます:

class Person
{
    public string Name { get; set; }
    public string StreetAddress { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }

    [ScriptIgnore]
    public Address Address { get {return new Address(){StreetAddress = this.StreetAddress,
                                                       City = this.City,
                                                       ZipCode = this.ZipCode} } }
}
于 2012-07-20T16:30:28.350 に答える
0
var person = JsonConvert.DeserializeObject<Person>(json);

class Person
{
    [JsonProperty("StreetAddress")]
    private string _StreetAddress { get; set; }

    [JsonProperty("City")]
    private string _City { get; set; }

    [JsonProperty("Zip")]
    private string _ZipCode { get; set; }

    public string Name { get; set; }

    public Address Address
    {
        get
        {
            return new Address() { City = _City, StreetAddress = _StreetAddress, ZipCode = _ZipCode };
        }
    }
}

class Address
{
    public string StreetAddress { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
}
于 2012-07-20T17:09:49.440 に答える