1

我有以下想要提取的 json 响应。我以前从未使用过 json 概念。只想知道如何使用 DataContractJsonSerializer 提取下面的 json 响应,以便我可以提取长名、短名或任何其他级别的属性。

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),当您访问 json url 时,可以更轻松地阅读 json 结构你的浏览器。

但是,如果您确实坚持使用 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;
}

要包括 long/lat,您必须将另一个类作为其另一个级别,例如几何 -> 位置。

然后您可以反序列化到最外面的对象,如下所示:

    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 回答