問題描述
以下是我在成功創(chuàng)建新的工作代碼"條目后從 REST API 獲得的(略微)精簡的響應(yīng).我需要將響應(yīng)反序列化為某些類,但我很難過.
Below is a (slightly) stripped down response I get from a REST API upon successful creation of a new "job code" entry. I need to deserialize the response into some classes, but I'm stumped.
作為參考,我在 .NET 3.5 中使用 JSON.NET(在 SQL Server 2008 R2 的 SSIS 腳本中運行)來嘗試反序列化.這是 JSON - 我顯然無法控制它,因為它來自其他人的 API:
For reference, I'm using JSON.NET in .NET 3.5 (running in a SSIS script in SQL Server 2008 R2) to attempt my deserialization. Here's the JSON - which I obviously have no control over as it's coming from someone else's API:
{
"results":{
"jobcodes":{
"1":{
"_status_code":200,
"_status_message":"Created",
"id":444444444,
"assigned_to_all":false,
"billable":true,
"active":true,
"type":"regular",
"name":"1234 Main Street - Jackson"
},
"2":{
"_status_code":200,
"_status_message":"Created",
"id":1234567890,
"assigned_to_all":false,
"billable":true,
"active":true,
"type":"regular",
"name":"4321 Some Other Street - Jackson"
}
}
}
}
在我的 C# 代碼中,我確實定義了一個JobCode"類,它僅將 JSON 值部分映射到屬性 - 我對返回給我的所有數(shù)據(jù)不感興趣:
In my C# code, I do have a "JobCode" class defined which only partially maps the JSON values to properties - I'm not interested in all of the data that's returned to me:
[JsonObject]
class JobCode
{
[JsonProperty("_status_code")]
public string StatusCode { get; set; }
[JsonProperty("_status_message")]
public string StatusMessage { get; set; }
[JsonProperty("id")]
public string Id {get; set;}
[JsonProperty("name")]
public string Name { get; set; }
//-------------------------------------------------------------------------------
// Empty constructor for JSON serialization support
//-------------------------------------------------------------------------------
public JobCode() { }
}
我正在嘗試通過此調(diào)用反序列化數(shù)據(jù):
I'm attempting to deserialize the data via this call:
newResource = JsonConvert.DeserializeObject<JobCode>(jsonResponse);
其中 jsonResponse 是上面輸出的代碼.
當我執(zhí)行代碼時,newResource"總是返回為空 - 這并不意外,因為我知道數(shù)據(jù)中實際上有多個作業(yè)代碼,并且此代碼試圖將其反序列化為單個 JobCode 對象.我嘗試創(chuàng)建一個名為JobCodes"的新類,如下所示:
Where jsonResponse is the code outputted above.
When I execute the code, "newResource" always comes back as null - which is not unexpected because I know that there are actually multiple jobcodes in the data and this code is trying to deserialize it into a single JobCode object. I tried creating a new class called "JobCodes" that looks like this:
class JobCodes
{
[JsonProperty("jobcodes")]
public List<JobCode>_JobCodes { get; set; }
}
然后我嘗試調(diào)用這個:
newResource = JsonConvert.DeserializeObject<JobCodes>(jsonResponse);
但問題仍然存在 - 我的返回對象為空.我認為讓我失望的是1"和2"標識符的存在.我不知道如何在我的對象設(shè)計和/或 JSON.NET 類/屬性屬性(如 [JsonObject]、[JsonProperty] 等)的使用中說明它們的存在.
But the issue persists - my return object is null. What's throwing me off, I think, is the presence of the "1" and "2" identifiers. I don't know how to account for their presence in my object design and/or usage of the JSON.NET class / property attributes like [JsonObject],[JsonProperty], etc.
當我通過 JSON2CSharp 運行 JSON 數(shù)據(jù)時,它會構(gòu)造一些看起來很奇怪的類,因此這并沒有被證明太有效.我已經(jīng)用幾個不同的驗證器驗證了 JSON 并且一切都檢查出來了——我只是不知道我在這里缺少什么.
When I run the JSON data through JSON2CSharp, it constructs some weird-looking classes, so that hasn't proven too effective. I've validated the JSON with several different validators and it all checks out - I just don't know what I'm missing here.
最終,我想從 JSON 數(shù)據(jù)中返回一個 List,但我不知道我需要做什么才能實現(xiàn)這一目標.
Ultimately, I'd like to return a List from the JSON data, but I'm stumped on what I need to do to make that happen.
推薦答案
你的問題是雙重的:
- 您沒有在根級別定義類.類結(jié)構(gòu)需要匹配整個 JSON,不能只從中間反序列化.
- 只要你有一個可以改變鍵的對象,你就需要使用
Dictionary
.普通課程對此不起作用;List<T>
也不會.
- You don't have a class defined at the root level. The class structure needs to match the entire JSON, you can't just deserialize from the middle.
- Whenever you have an object whose keys can change, you need to use a
Dictionary<string, T>
. A regular class won't work for that; neither will aList<T>
.
讓你的課程像這樣:
class RootObject
{
[JsonProperty("results")]
public Results Results { get; set; }
}
class Results
{
[JsonProperty("jobcodes")]
public Dictionary<string, JobCode> JobCodes { get; set; }
}
class JobCode
{
[JsonProperty("_status_code")]
public string StatusCode { get; set; }
[JsonProperty("_status_message")]
public string StatusMessage { get; set; }
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
}
然后,像這樣反序列化:
Then, deserialize like this:
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
這里的工作演示
這篇關(guān)于將 JSON 反序列化為 C# 類的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!