2

要求された場所に基づいて、毎回同じ応答を返すわけではない Api を使用します。より詳細な場所もあれば、他のコンテンツよりも多くの属性を持つコンテンツもあります。結果のシリアル化されたオブジェクトは毎回同じではなく、一致しない場合は逆シリアル化エラーが発生します。このプロジェクトのオブジェクトは、コンテンツ レスポンス全体と一致するのではなく、このコンテンツの 1 つの部分であるセントロイドのみに一致します。

{
   "place":{
      "woeid":12345,
      "placeTypeName":"State",
      "placeTypeName attrs":{
         "code":8
      },
      "name":"My Region",
      "country":"",
      "country attrs":{
         "type":"Country",
         "code":"XX"
      },
      "admin1":"My Region",
      "admin1 attrs":{
         "type":"Region",
         "code":""
      },
      "admin2":"",
      "admin3":"",
      "locality1":"",
      "locality2":"",
      "postal":"",
      "centroid":{
         "latitude":30.12345,
         "longitude":40.761292
      },
      "boundingBox":{
         "southWest":{
            "latitude":32.2799,
            "longitude":50.715958
         },
         "northEast":{
            "latitude":29.024891,
            "longitude":12.1234
         }
      },
      "areaRank":10,
      "popRank":0,
      "uri":"http:\/\/where.yahooapis.com",
      "lang":"en-US"
   }
}

誰かが、完全な応答 (重心が同じ場所にない) の代わりにコンテンツの一部を逆シリアル化する、または変化する応答スキーマを逆シリアル化するための最良の方法を指摘できますか?

私は ServiceStack C# シリアライザーを使用していますが、すべての提案を歓迎します。ありがとう。

4

2 に答える 2

1

標準の.NETFrameworkの一部であるDataContractJsonSerializerを使用できます。関心のある属性だけを定義します。他の属性は無視されます。

class CentroidReader
{
    public static Centroid ReadControid(Stream stream)
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Response));
        Response response = serializer.ReadObject(stream) as Response;
        return response.Place.Centroid;
    }
}

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

[DataContract]
class Place
{
    [DataMember(Name = "centroid")]
    public Centroid Centroid { get; set; }
}

[DataContract]
class Centroid
{
    [DataMember(Name = "latitude")]
    public double? Latitude { get; set; }
    [DataMember(Name = "longitude")]
    public double? Longitude { get; set; }
}
于 2011-02-20T16:41:49.050 に答える
1

GitHub の JSON API の 1 つを解析するこの例でわかるように、ServiceStack の JsonSerializer を使用してこれを解析する方法はいくつかあります。

ServiceStack の JsonSerializer で慣れ親しんでいる 1 ライナー以上のものが必要ですが、選択した C# クラスにたどり着くまでにJsonObjectアプローチを採用します。とにかく、結果のコードは次のとおりです。

Func<JsonObject, Centroid> toCentroid = map => 
    new Centroid(map.Get<decimal>("latitude"), map.Get<decimal>("longitude"));

var place = JsonObject.Parse(JsonCentroid)
    .Object("place")
    .ConvertTo(x => new Place
    {
        WoeId = x.Get<int>("woeid"),
        PlaceTypeName = x.Get(""),
        PlaceTypeNameAttrs = x.Object("placeTypeName attrs"),
        Name = x.Get("Name"),
        Country = x.Get("Country"),
        CountryAttrs = x.Object("country attrs"),
        Admin1 = x.Get("admin1"),
        Admin1Attrs = x.Object("admin1 attrs"),
        Admin2 = x.Get("admin2"),
        Admin3 = x.Get("admin3"),
        Locality1 = x.Get("locality1"),
        Locality2 = x.Get("locality2"),
        Postal = x.Get("postal"),

        Centroid = x.Object("centroid")
            .ConvertTo(toCentroid),

        BoundingBox = x.Object("boundingBox")
            .ConvertTo(y => new BoundingBox
            {
                SouthWest = y.Object("southWest").ConvertTo(toCentroid),
                NorthEast = y.Object("northEast").ConvertTo(toCentroid)
            }),

        AreaRank = x.Get<int>("areaRank"),
        PopRank = x.Get<int>("popRank"),
        Uri = x.Get("uri"),
        Lang = x.Get("lang"),
    });

この例の完全なソース コードは次のとおりです。

于 2011-02-21T01:25:04.080 に答える