下面是我在成功创建新的"作业代码"条目后从REST API获得的(稍微)精简的响应.我需要将响应反序列化为某些类,但我很难过.
作为参考,我在.NET 3.5中使用JSON.NET(在SQL Server 2008 R2中的SSIS脚本中运行)来尝试反序列化.这是JSON - 我显然无法控制它,因为它来自其他人的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"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的C#代码中,我确实定义了一个"JobCode"类,它只将JSON值部分映射到属性 - 我对返回给我的所有数据都不感兴趣:
[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() { }
}
Run Code Online (Sandbox Code Playgroud)
我试图通过此调用反序列化数据:
newResource = JsonConvert.DeserializeObject<JobCode>(jsonResponse);
Run Code Online (Sandbox Code Playgroud)
其中jsonResponse是上面输出的代码.
当我执行代码时,"newResource"总是返回null - 这并不意外,因为我知道数据中实际上有多个作业代码,而且这段代码试图将其反序列化为单个JobCode对象.我尝试创建一个名为"JobCodes"的新类,如下所示:
class JobCodes
{
[JsonProperty("jobcodes")]
public List<JobCode>_JobCodes { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我试着这样说:
newResource = JsonConvert.DeserializeObject<JobCodes>(jsonResponse);
Run Code Online (Sandbox Code Playgroud)
但问题仍然存在 - 我的返回对象为null.我认为,让我失望的是"1"和"2"标识符的存在.我不知道如何解释他们在我的对象设计中的存在和/或JSON.NET类/属性属性的使用,如[JsonObject],[JsonProperty]等.
当我通过JSON2CSharp运行JSON数据时,它构造了一些奇怪的类,所以这并没有证明太有效.我已经使用几个不同的验证器验证了JSON并且它都检查了 - 我只是不知道我在这里缺少什么.
最后,我想从JSON数据中返回一个List,但是我很难理解我需要做些什么来实现这一点.
Bri*_*ers 51
你的问题是双重的:
Dictionary<string, T>.普通班级不适用于此; 也不会List<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; }
}
Run Code Online (Sandbox Code Playgroud)
然后,反序列化如下:
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
Run Code Online (Sandbox Code Playgroud)
优秀的答案!
对于那些可能需要更多JSON类配置帮助的人,请尝试:http://json2csharp.com/#
自动生成类的一种很好的方法!
甚至更容易,在VS中,Goto:
编辑 - >选择性粘贴 - >粘贴为JSON类
| 归档时间: |
|
| 查看次数: |
69496 次 |
| 最近记录: |