[英]Trouble deserializing Json from REST service
我最難的時候反序列化json字符串。
我正在使用RestSharp api,如果我在請求中指定了RootElement,則效果很好。 然后,我移至Hammock以獲得OAuth功能,但是反序列化並非那么容易。
我試過使用DataContractJsonSerializer
DataContractJsonSerializer ser =新的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]'。
在調用ExecuteAsync時,RestSharp會輕松地處理此問題。 Client.ExecuteAsync<List<Member>>(request, (response) =>
我機智。 也許我需要一個相當於RestSharp的RootElement屬性的吊床? 僅僅是我的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; }
}
這是傑森:
{
"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中不起作用。 從您的問題很難分辨這是從VisualStudio調試器復制它的產物還是數據中的問題。
傳輸的數據不是成員實例列表,而是既包含成員實例列表又包含一些其他元信息的對象。 因此,您需要引入一個帶有兩個成員結果和meta的附加類。
您的類Member使用以大寫字母開頭的屬性,而JSON數據使用所有小寫字母的屬性。 您可以更改屬性名稱或使用數據DataMember注釋:
因此,解決方案可能是:
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(JsonResponse));
JsonResponse jsonResponse = (JsonResponse)ser.ReadObject(response.ContentStream);
具有以下類定義:
[DataContract]
public partial class Member
{
[DataMember(Name = "state")]
public string State { get; set; }
[DataMember(Name = "joined")]
public string Joined { get; set; }
[DataMember(Name = "lat")]
public string Lat { get; set; }
[DataMember(Name = "zip")]
public string Zip { get; set; }
[DataMember(Name = "bio")]
public string Bio { get; set; }
[DataMember(Name = "name")]
public string Name { get; set; }
[DataMember(Name = "state")]
public string City { get; set; }
[DataMember(Name = "city")]
public string Id { get; set; }
[DataMember(Name = "link")]
public string Link { get; set; }
[DataMember(Name = "country")]
public string Country { get; set; }
[DataMember(Name = "visited")]
public string Visited { get; set; }
[DataMember(Name = "photo_url")]
public string PhotoUrl { get; set; }
[DataMember(Name = "lon")]
public string Lon { get; set; }
}
[DataContract]
public class Meta
{
[DataMember(Name = "lon")]
public string Lon { get; set; }
[DataMember(Name = "count")]
public int Count { get; set; }
[DataMember(Name = "link")]
public string Link { get; set; }
[DataMember(Name = "next")]
public string Next { get; set; }
[DataMember(Name = "total_count")]
public int TotalCount { get; set; }
}
[DataContract]
public class JsonResponse
{
[DataMember(Name = "results")]
public List<Member> Results { get; set; }
[DataMember(Name = "meta")]
public Meta Meta { get; set; }
}
在我們的項目中,我們為此使用Hammok,您可以嘗試像這樣修改您的類:
[DataContract]
public partial class Member
{
[DataMember(Name="zip")]
public string Zip { get; set; }
[DataMember(Name="photo_url")]
public string Photo_url { get; set; }
//Etc.
}
嘗試使用Json.net。 我發現DataContractJsonSerializer太過時了。 json.net提供了強大的功能。 可以在此鏈接上找到
它也包含.dll文件和文檔。 用於Web文檔http://james.newtonking.com/projects/json/help/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.