我正在開發一個使用JSON.NET與第三方REST API接口的ASP.NET應用程序。該API按以下格式返回JSON:有沒有一種方法來反序列化我的JSON而不使用每個項目的包裝類?
[
{
user: {
id: 12345,
first_name: "John",
last_name: "Smith",
created_at: "11/12/13Z00:00:00"
}
},
{
user: {
id: 12346,
first_name: "Bob",
last_name: "Adams",
created_at: "12/12/13Z00:00:00"
}
}
]
的user
場是多餘的,但我沒有在API控制,所以我不得不忍受它。我目前使用下面的代碼來反序列化JSON:
// Deserialize
var responseBody = JsonConvert.DeserializeObject<IEnumerable<UserWrapper>>(responseString);
// Access Properties
foreach (var userWrapper in responseBody)
{
var firstName = userWrapper.User.FirstName
}
// Model classes
public class UserWrapper
{
[JsonProperty(PropertyName = "user")]
public User User { get; set; }
}
public class User
{
[JsonProperty(PropertyName = "id")]
public string ID { get; set; }
[JsonProperty(PropertyName = "first_name")]
public string FirstName { get; set; }
[JsonProperty(PropertyName = "last_name")]
public string LastName { get; set; }
[JsonProperty(PropertyName = "created_at")]
public DateTime CreatedAt { get; set; }
}
擁有包裝類有點難看。所以我的問題是:
有沒有辦法使用JSON.NET消除包裝類?
如何實現WriteJson方法?我曾嘗試使用編寫器編寫用戶屬性,然後使用序列化程序對該值進行序列化,但是這會導致自引用循環,因爲序列化程序只是在另一個UserConverter上使用調用WriteJson。請參閱代碼: –
http://pastebin.com/B2QMVtyM –
您近在咫尺 - 只需使用新的序列化器,而不是傳入的新序列器。新的序列器將不會提供轉換器的引用,因此您將不會獲得通告參考問題。我已經用代碼更新了我的答案。唯一的缺點是它不會選擇你可能使用的任何其他序列化器設置 - 如果你需要這些設置,你必須手動將它們從外部串行器複製到內部。 –