1

私はこのようなJSON結果を持っています

{
   "authenticationResultCode":"ValidCredentials",
   "brandLogoUri":"http:\/\/dev.virtualearth.net\/Branding\/logo_powered_by.png",
   "copyright":"Copyright © 2011 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.",
   "resourceSets":[
      {
         "estimatedTotal":1,
         "resources":[
            {
               "__type":"Location:http:\/\/schemas.microsoft.com\/search\/local\/ws\/rest\/v1",
               "bbox":[
                  47.636257744012461,
                  -122.13735364288299,
                  47.643983179153814,
                  -122.12206713944467
               ],
               "name":"1 Microsoft Way, Redmond, WA 98052",
               "point":{
                  "type":"Point",
                  "coordinates":[
                     47.640120461583138,
                     -122.12971039116383
                  ]
               },
               "address":{
                  "addressLine":"1 Microsoft Way",
                  "adminDistrict":"WA",
                  "adminDistrict2":"King Co.",
                  "countryRegion":"United States",
                  "formattedAddress":"1 Microsoft Way, Redmond, WA 98052",
                  "locality":"Redmond",
                  "postalCode":"98052"
               },
               "confidence":"High",
               "entityType":"Address",
               "geocodePoints":[
                  {
                     "type":"Point",
                     "coordinates":[
                        47.640120461583138,
                        -122.12971039116383
                     ],
                     "calculationMethod":"InterpolationOffset",
                     "usageTypes":[
                        "Display"
                     ]
                  },
                  {
                     "type":"Point",
                     "coordinates":[
                        47.640144601464272,
                        -122.12976671755314
                     ],
                     "calculationMethod":"Interpolation",
                     "usageTypes":[
                        "Route"
                     ]
                  }
               ],
               "matchCodes":[
                  "Good"
               ]
            }
         ]
      }
   ],
   "statusCode":200,
   "statusDescription":"OK",
   "traceId":"b0b1286504404eafa7e7dad3e749d570"
}

オブジェクトのリストを取得したいのですが、すべてのオブジェクトに座標の値が含まれます

では、これらの要素に名前でアクセスするにはどうすればよいでしょうか?

コードビハインドとしてC#を使用しています。

4

3 に答える 3

0

以下の URL からすべての Bing Maps REST サービスのクラスをプロジェクトに追加します。

JSON データ コントラクト

次に、必ず using ディレクティブを追加してください。

using BingMapsRESTService.Common.JSON;

次のように文字列を読み取ります(streamはjsonのストリームです):

var d = new DataContractJsonSerializer(typeof(Response));
var o = d.ReadObject(stream);
于 2013-07-08T10:02:43.360 に答える
0

このタスクにはJson.NETのようなパッケージを使用できます。

http://json2csharp.com/からjson文字列を指定することで、簡単にクラスを生成できます

次に、以下のようにアイテムのプロパティにアクセスできます

RootObject obj = JsonConvert.DeserializeObject<RootObject>(jsonText);

以下は、指定されたjsonのjson2csharpから生成されたクラスです

public class Point
{
    public string type { get; set; }
    public List<double> coordinates { get; set; }
}

public class Address
{
    public string addressLine { get; set; }
    public string adminDistrict { get; set; }
    public string adminDistrict2 { get; set; }
    public string countryRegion { get; set; }
    public string formattedAddress { get; set; }
    public string locality { get; set; }
    public string postalCode { get; set; }
}

public class GeocodePoint
{
    public string type { get; set; }
    public List<double> coordinates { get; set; }
    public string calculationMethod { get; set; }
    public List<string> usageTypes { get; set; }
}

public class Resource
{
    public string __type { get; set; }
    public List<double> bbox { get; set; }
    public string name { get; set; }
    public Point point { get; set; }
    public Address address { get; set; }
    public string confidence { get; set; }
    public string entityType { get; set; }
    public List<GeocodePoint> geocodePoints { get; set; }
    public List<string> matchCodes { get; set; }
}

public class ResourceSet
{
    public int estimatedTotal { get; set; }
    public List<Resource> resources { get; set; }
}

public class RootObject
{
    public string authenticationResultCode { get; set; }
    public string brandLogoUri { get; set; }
    public string copyright { get; set; }
    public List<ResourceSet> resourceSets { get; set; }
    public int statusCode { get; set; }
    public string statusDescription { get; set; }
    public string traceId { get; set; }
}
于 2013-07-08T09:48:02.510 に答える
0

すでに を使用しているように見えるのでDataContractJsonSerializer、そのままにしておきましょう。json を逆シリアル化する最善の方法は、関連データを取得するモデルを最初に定義することです。

public class JsonModel
{
    public int StatusCode { get; set; }
    public string StatusDescription { get; set; }
    public string TraceId { get; set; }
    ...
}

次に、デシリアライゼーションに適合するようにモデルを装飾します

[DataContract]
public class JsonModel
{
    [DataMember(Name = "statusCode")]
    public int StatusCode { get; set; }
    [DataMember(Name = "statusDescription")]
    public string StatusDescription { get; set; }
    [DataMember(Name = "traceId")]
    public string TraceId { get; set; }
    ...
}

最後に、逆シリアル化を実行します

using (var memoryStream = new MemoryStream(Encoding.Unicode.GetBytes(jsonData))) 
{    
    var serializer = new DataContractJsonSerializer(typeof(JsonModel));
    var model = (JsonModel) serializer.ReadObject(memoryStream);  
    Console.WriteLine(model.StatusCode);
}

では、これらの要素に名前でアクセスするにはどうすればよいでしょうか?

プロパティを名前で参照できるようにする逆シリアル化の他のオプションは、dynamicオブジェクトを使用することです。

var model = new JavaScriptSerializer().Deserialize<dynamic>(jsonData);
Console.WriteLine(model["statusCode"]);
于 2013-07-08T09:57:26.423 に答える