【发布时间】:2011-06-30 06:59:39
【问题描述】:
我在反序列化 json 字符串时遇到了困难。
我使用的是 RestSharp api,如果我在请求中指定了 RootElement,效果会很好。然后我转移到 Hammock 来使用 OAuth 功能,但反序列化并不那么容易。
我尝试过使用 DataContractJsonSerializer
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List)); var member = (List)ser.ReadObject(response.ContentStream);
但这给了我一个 InvalidCastException。
我试过 JsonConvert
var members = JsonConvert.DeserializeObject<List<Member>>(response.Content);
但出现异常:无法将 JSON 对象反序列化为类型“System.Collections.Generic.List`1[Member]”。
RestSharp 在调用 ExecuteAsync 时轻松解决了这个问题。 Client.ExecuteAsync<List<Member>>(request, (response) =>
我已经束手无策了。 也许我需要一个与 RestSharp 的 RootElement 属性等效的 Hammock?? 只是我的 Json 难以转换?
这是我的成员对象
public partial class Member
{
public string State { get; set; }
public string Joined { get; set; }
public string lat { get; set; }
public string Zip { get; set; }
public string Bio { get; set; }
public string Name { get; set; }
public string City { get; set; }
public string Id { get; set; }
public string Link { get; set; }
public string Country { get; set; }
public string Visited { get; set; }
public string Photo_url { get; set; }
public string lon { get; set; }
}
这是 Json:
{
"results": [
{
"zip": "11111",
"lon": "-122.22000122070312",
"photo_url": "http: //photos1.aaaaa.com/photos/member/1/6/c/e/member_4469838.jpeg",
"link": "http: //www.aaaa.com/members/7804365",
"state": "AA",
"lang": "en_US",
"city": "MyCity",
"country": "us",
"id": "7804365",
"visited": "Sat Feb 19 02: 36: 40 EST 2011",
"topics": [
{
"id": 3340,
"urlkey": "pickupsoccer",
"name": "Pick-up Soccer"
},
{
"id": 468,
"urlkey": "dads",
"name": "Dads"
},
{
"id": 20557,
"urlkey": "coed-soccer",
"name": "Coed Soccer"
},
{
"id": 148421,
"urlkey": "windowsphone",
"name": "Windows Phone"
}
],
"joined": "Thu Aug 07 15: 32: 06 EDT 2008",
"bio": "",
"name": "aaa bbbb",
"other_services": {
"linkedin": {
"identifier": "http: //www.bbb.com/in/zzzzz"
}
},
"lat": "47.790000915527344"
}
],
"meta": {
"lon": "",
"count": 1,
"link": "https: //api.aaaaa.com/members",
"next": "",
"total_count": 1,
"url": "https: //api.aaaaa.com/members?relation=self&order=name&offset=0&format=json&page=800",
"id": "",
"title": "Members",
"updated": "Fri Sep 10 13: 08: 07 EDT 2010",
"description": "API method",
"method": "Members",
"lat": ""
}
}
更新 为我的 Member 类添加一个封装整个 json 结果的包装器对象解决了这个问题。
public partial class Members
{
public List<Member> results { get; set; }
public object meta { get; set; }
}
然后我可以使用以下方法进行反序列化:
var members = JsonConvert.DeserializeObject<Members>(jsonstring);
【问题讨论】:
-
你能告诉我们没有所有转义双引号的 JSON 数据吗?传输的 JSON 数据希望不包含它们,因为它们不是有效的 JSON 数据,而可能是您的 C# 开发环境的产物。
-
删除了转义字符并进行了格式化。找到解决方案。感谢您的帮助。
标签: json windows-phone-7 deserialization