1

抽出したい次の json 応答があります。以前は json の概念を使用したことがありません。DataContractJsonSerializer を使用して以下の json 応答を抽出し、longname、shortname、またはその他のレベル属性を抽出する方法を知りたいだけです。

http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=true

私が書いたコードは、要素の値を返しません:

       var ms = new MemoryStream(Encoding.Unicode.GetBytes(e.Result));
        DataContractJsonSerializer stdserialize = new DataContractJsonSerializer(typeof(Address));
        Address stuser = (Address)stdserialize.ReadObject(ms);


   //############################################################################################################################
    [DataContract]
    public class Address
    {
        [DataMember(Name = "long_name")]
        public string address1;
        [DataMember(Name = "short_name")]
        public string shortaddress;
        [DataMember(Name = "formatted_address")]
        public string formattedtaddress;
        [DataMember(Name = "lat")]
        public string latitude;
        [DataMember(Name = "long")]
        public string latitude;
    }
    //##############################################################################################################################
    [DataContract]
    public class result
    {
        [DataMember(Name = "results")]
        public string totalResult { get; set; }
        [DataMember(Name = "address_components")]
        public Dictionary<string, Address> merchants { get; set; }
    }
//###################################################################################################################

どんな助けでも大歓迎です。

4

1 に答える 1

2

まず第一に、逆シリアル化に Json.net を使用することをお勧めします。これは使いやすく、WP バージョンがあり、DataContractJsonSerializer よりも何倍も高速です - http://json.codeplex.com/を参照してください。

また、Pretty Json for Chrome (https://chrome.google.com/webstore/detail/pretty-json/ddngkjbldiejbheifcmnfmmfiniimbbg) のようなブラウザー プラグインを試してみてください。あなたのブラウザ。

ただし、DataContractJsonSerializer に固執する場合は、正しい方向に進んでいます。クラスを Json の構造に一致させる必要があるだけです (そのプラグインが役立ちます)。最も外側のオブジェクトには、アドレスのリストとテキスト ステータスが含まれます。

[DataContract]
public class Result
{
    [DataMember(Name = "status")]
    public string Status { get; set; }

    [DataMember(Name = "results")]
    public Address[] Results { get; set; }
}

次に、各アドレス オブジェクトは次のようになります。

[DataContract]
public class Address
{
    [DataMember(Name = "formatted_address")]
    public string FormattedAddress;

    [DataMember(Name = "address_components")]
    public AddressComponent[] AddressComponents;
}

次のような住所コンポーネントのリストがあります。

[DataContract]
public class AddressComponent
{
    [DataMember(Name = "long_name")]
    public string LongName;

    [DataMember(Name = "short_name")]
    public string ShortName;

    [DataMember(Name = "types")]
    public string Types;
}

経度/緯度を含めるには、別のレベルの下に別のクラスが必要です。たとえば、ジオメトリ -> 場所です。

次に、次のように、最も外側のオブジェクトに逆シリアル化できます。

    var ms = new MemoryStream(Encoding.Unicode.GetBytes(e.Result));
    DataContractJsonSerializer stdserialize = new DataContractJsonSerializer(typeof(Result));
    Result res = (Result)stdserialize.ReadObject(ms);

res.Results次に、各アドレスを調べることができます

于 2012-11-12T14:20:38.307 に答える