C# 如何在WindowsPhone7中为JSON web服务结果创建类?

C# 如何在WindowsPhone7中为JSON web服务结果创建类?,c#,silverlight-3.0,windows-phone-7,C#,Silverlight 3.0,Windows Phone 7,如何为JSON web服务结果创建类?这是我从GoogleAPI得到的JSON结果。那么,如何为这个JSON对象创建类和反序列化。 我创建了一个类来反序列化这个JSON对象,如下所示 string mapdetail = e.Result; var djosn = new DataContractJsonSerializer(typeof(mapResult)); var mstr = new MemoryStream(Encoding.UTF8.GetByte

如何为JSON web服务结果创建类?这是我从GoogleAPI得到的JSON结果。那么,如何为这个JSON对象创建类和反序列化。

我创建了一个类来反序列化这个JSON对象,如下所示

string mapdetail = e.Result;
        var djosn = new DataContractJsonSerializer(typeof(mapResult));
        var mstr = new MemoryStream(Encoding.UTF8.GetBytes(mapdetail));
        mapResult reslt = (mapResult)djosn.ReadObject(mstr);
mapResult类:

[DataContract]
public class mapResult
{
    [DataMember]
    public string status
    {
        get;
        set;
    }
    [DataMember]
    public IList<Resultdetail> result
    {
        get;
        set;
    }
}
[DataContract]
公共类映射结果
{
[数据成员]
公共字符串状态
{
得到;
设置
}
[数据成员]
公共图书馆结果
{
得到;
设置
}
}
因此,我为结果详细信息和其他信息创建了列表:

[DataContract]
public class Resultdetail
{
    [DataMember]
    public List<string> types
    {
        get;
        set;
    }
    [DataMember]
    public string formatted_address
    {
        get;
        set;
    }
    [DataMember]
    public List<object> address_components
    {
        get;
        set;
    }
    [DataMember]
    public List<Geometry> geometry
    {
        get;
        set;
    }

}

[DataContract]
public class Geometry
{
    [DataMember]
    public List<GeoLocation> location
    {
        get;
        set;
    }
    [DataMember]
    public string location_type
    {
        get;
        set;
    }
    [DataMember]
    public List<object> viewport
    {
        get;
        set;
    }
    [DataMember]
    public List<object> bounds
    {
        get;
        set;
    }

}

[DataContract]
public class GeoLocation
{
    [DataMember]
    public double lat
    {
        get;
        set;
    }
    [DataMember]
    public double lng
    {
        get;
        set;
    }

}
[DataContract]
公共类结果详细信息
{
[数据成员]
公共列表类型
{
得到;
设置
}
[数据成员]
公共字符串格式的地址
{
得到;
设置
}
[数据成员]
公共列表地址\u组件
{
得到;
设置
}
[数据成员]
公共列表几何体
{
得到;
设置
}
}
[数据合同]
公共课几何
{
[数据成员]
公共列表位置
{
得到;
设置
}
[数据成员]
公共字符串位置\u类型
{
得到;
设置
}
[数据成员]
公共列表视口
{
得到;
设置
}
[数据成员]
公共列表边界
{
得到;
设置
}
}
[数据合同]
公共类地理定位
{
[数据成员]
公共双lat
{
得到;
设置
}
[数据成员]
公用双液化天然气
{
得到;
设置
}
}
现在我得到了空引用


我注意到,您的顶级列表名为
result
,而JSON名称是
results
btw-它能这么简单吗?反序列化程序可能会忽略
结果
值,因为您没有该名称的属性

如果那不起作用。。。在该语句中有7个解引用操作。(4个明显的索引操作和3个数组索引操作)。这是很多可能的失败点。我建议您在该语句上设置一个断点(在它执行之前中断),然后使用watch窗口查看实际得到的结果


(就我个人而言,我在Windows Phone 7中使用的是内置库,而不是内置库,但我相信后者也会起作用。)

我注意到,您的顶级列表名为
result
,而JSON名称是
results
btw-它会这么简单吗?反序列化程序可能会忽略
结果
值,因为您没有该名称的属性

如果那不起作用。。。在该语句中有7个解引用操作。(4个明显的索引操作和3个数组索引操作)。这是很多可能的失败点。我建议您在该语句上设置一个断点(在它执行之前中断),然后使用watch窗口查看实际得到的结果


(就我个人而言,我在Windows Phone 7中使用的是内置库,而不是内置库,但我相信后者也应该可以使用。)

您的DatContract类存在一些问题

我在下面更正了这些,注释掉了原始行,并添加了一条关于具体错误的注释

[DataContract]
public class mapResult
{
    [DataMember]
    public string status { get; set; }
    [DataMember]
    //public IList<Resultdetail> result { get; set; }
    // Misspelt property name and use of interface rather than concrete type
    public List<Resultdetail> results { get; set; }
}

[DataContract]
public class Resultdetail
{
    [DataMember]
    public List<string> types { get; set; }
    [DataMember]
    public string formatted_address { get; set; }
    [DataMember]
    public List<object> address_components { get; set; }
    [DataMember]
    //public List<Geometry> geometry { get; set; }
    // Json does not contain an array/list of these
    public Geometry geometry { get; set; }
}

[DataContract]
public class Geometry
{
    [DataMember]
    //public List<GeoLocation> location { get; set; }
    // Json does not contain an array/list of these
    public GeoLocation location { get; set; }
    [DataMember]
    public string location_type { get; set; }
    [DataMember]
    // public List<object> viewport { get; set; }  
    // Json does not contain an array/list of these
    public object viewport { get; set; }
    [DataMember]
    //public List<object> bounds { get; set; }
    // Json does not contain an array/list of these
    public object bounds { get; set; }
}
[DataContract]
公共类映射结果
{
[数据成员]
公共字符串状态{get;set;}
[数据成员]
//公共IList结果{get;set;}
//拼写错误的属性名称和接口的使用,而不是具体类型
公共列表结果{get;set;}
}
[数据合同]
公共类结果详细信息
{
[数据成员]
公共列表类型{get;set;}
[数据成员]
公共字符串格式的_地址{get;set;}
[数据成员]
公共列表地址_组件{get;set;}
[数据成员]
//公共列表几何体{get;set;}
//Json不包含这些元素的数组/列表
公共几何体{get;set;}
}
[数据合同]
公共课几何
{
[数据成员]
//公共列表位置{get;set;}
//Json不包含这些元素的数组/列表
公共地理位置{get;set;}
[数据成员]
公共字符串位置\u类型{get;set;}
[数据成员]
//公共列表视口{get;set;}
//Json不包含这些元素的数组/列表
公共对象视口{get;set;}
[数据成员]
//公共列表边界{get;set;}
//Json不包含这些元素的数组/列表
公共对象边界{get;set;}
}
下面的代码显示了这一点:

var jsonStr = "{\"status\": \"OK\", \"results\": [ { \"types\": [ \"route\" ], \"formatted_address\": \"7th Main Rd, Koramangala, sengaluru, Karnataka 560034, India\", \"address_components\": [ { \"long_name\": \"7th Main Rd\", \"short_name\": \"7th Main Rd\", \"types\": [ \"route\" ] }, { \"long_name\": \"Koramangala\", \"short_name\": \"Koramangala\", \"types\": [ \"sublocality\", \"political\" ] }, { \"long_name\": \"Bengaluru\", \"short_name\": \"Bengaluru\", \"types\": [ \"locality\", \"political\" ] }, { \"long_name\": \"sengaluru\", \"short_name\": \"sengaluru\", \"types\": [ \"administrative_area_level_2\", \"political\" ] }, { \"long_name\": \"Karnataka\", \"short_name\": \"Karnataka\", \"types\": [ \"administrative_area_level_1\", \"political\" ] }, { \"long_name\": \"India\", \"short_name\": \"IN\", \"types\": [ \"country\", \"political\" ] }, { \"long_name\": \"560034\", \"short_name\": \"560034\", \"types\": [ \"postal_code\" ] }],\"geometry\": { \"location\":{ \"lat\": 12.9259085, \"lng\": 77.6334715 }, \"location_type\": \"GEOMETRIC_CENTER\", \"viewport\": { \"southwest\": { \"lat\": 12.9227118, \"lng\": 77.6301852 }, \"northeast\": { \"lat\": 12.929007, \"lng\": 77.6364805}}, \"bounds\": { \"southwest\": { \"lat\": 12.9247615, \"lng\": 77.6330486 },\"northeast\": { \"lat\": 12.9269574, \"lng\": 77.6336171 }}}}]}";

// If using json.net (http://json.codeplex.com/)
var des = JsonConvert.DeserializeObject<mapResult>(jsonStr);

// If using System.Runtime.Serialization.Json
var djosn = new DataContractJsonSerializer(typeof(mapResult));
var mstr = new MemoryStream(Encoding.UTF8.GetBytes(jsonStr));
des = (mapResult)djosn.ReadObject(mstr);

var latitude = des.results[0].geometry.location.lat;
var longitude = des.results[0].geometry.location.lng;
var jsonStr=“{\'status\”:“OK\”,“results\”:[{\'types\”:[“route\”],“formatted\”:“7th Main Rd,Koramangala,Sengaluu,Karnataka 560034,India\”,“address\u components\”:[{\'long\u name\:“7th Main Rd\”,“short\u name\”:“7th Main Rd\”,“types\”:[“route\”,“route\”,“route\”,“route\”,“long\koru name\”,“galu\”,“short\”,“:“,”galuKoramangala\“,”types\“:[”次地方性\“,”政治性\“],”{“长名\“:”班加鲁鲁\“,”短名\“:”班加鲁鲁\“,”类型\“:[”地方\“,”政治性\“],{”长名\“:”森加鲁鲁\“,”短名\“:”森加鲁鲁\“,”类型\“:[”行政区2级\“,”政治性\“,”长名\“,”纳塔卡\”\“:”卡纳塔克邦“,”类型“:”[”行政区1级“,”政治“,”,“{”长名“:”印度“,”短名“:”IN“,”类型“:[”国家“,”政治“],”,“{”长名“:”560034“,”短名“:”560034“,”类型“:[”邮政编码“,”,“,”地理位置“:”,”,“:”,“,”,“,”,“,”,“,”,“,”,“,”,“,”,“,”,“,”,“,”,“,”,”,“,“,”,”,“,”,“,”,“,”,“,”,“,”,”,“,”,“,“,“,”,”,“,“,“,”,”,“,”,“,”,“,”,“,”,“,“,”,“\“位置类型”:“几何中心”:“视窗”:“西南”:“纬度”:12.9227118,“液化天然气”:77.6301852;“东北”:“纬度”:12.929007;“液化天然气”:77.6364805;“边界”:“西南”:“纬度”:12.9247615;“液化天然气”:77.6330486;“东北”:“纬度”:77.636364805;“边界”:“西南面”:“纬度”:12.9247615;“液化天然气”:77.6330486;“东北面”:“东南面”:;
//如果使用json.net(http://json.codeplex.com/)
var des=JsonConvert.DeserializeObject(json