奇怪的 JSON 格式 - 最好的处理方式是什么?
Strange JSON Format - What would be best handling?
我对 rest api 还很陌生,并尝试遵循一些简单的教程。使用我得到的一些测试 Uri
服务器对象的响应如下所示:
{
"server": {
"id": 123456,
"name": "srv-ubuntu-01",
"status": "running",
"created": "2021-01-11T13:04:24+00:00"
}
}
通常我可以使用 NewtonSoft.Json 和
反序列化它
var server = JsonConvert.DeserializeObject<XServer>(jsonString);
使用给定 class:
public class XServer
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("name")]
public String Name { get; set; }
[JsonProperty("status")]
public String Status { get; set; }
[JsonProperty("created")]
public DateTime DateCreate { get; set; }
}
但是,在这种情况下,这不起作用,因为来自服务器的 json 响应将服务器对象保存为“子对象”((?)我不知道正确的术语) .所以我想我可以使用以下代码作为解决方法:
var def = new { server = new Object() };
var defObj = JsonConvert.DeserializeAnonymousType(jsonString, def);
var obj = JsonConvert.DeserializeObject<XServer>(defObj.server.ToString());
但这不可能,对吧?显然我缺少了一些东西……至少我是这么认为的。如前所述,欢迎任何意见,我是初学者,渴望学习 ;)
您的根对象有键 server
,它有对象 XServer
。
反序列化为 RootObject 以访问服务器对象,'XServer'。
public class RootObject {
[JsonProperty("server")]
public XServer Server {get; set;}
}
var obj = JsonConvert.DeserializeObject<RootObject>(jsonString);
XServer server = obj.Server;
===========解决方案===========
所以使用@madreflections 输入我得到了以下解决方案,它工作得很好:
public class XServerRootObject
{
[JsonProperty("server")]
public XServer Server { get; set; }
}
public class XServer
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("name")]
public String Name { get; set; }
[JsonProperty("status")]
public String Status { get; set; }
[JsonProperty("created")]
public DateTime DateCreate { get; set; }
}
使用根对象如下:
public XServer GetServer(int id)
{
var req = new RestRequest("/servers/" + id, Method.GET, DataFormat.Json);
req.AddHeader("authorization", "Bearer " + _token);
var json = _client.Get(req).Content;
var srvRoot = JsonConvert.DeserializeObject<XServerRootObject>(json);
return srvRoot.Server;
}
我对 rest api 还很陌生,并尝试遵循一些简单的教程。使用我得到的一些测试 Uri 服务器对象的响应如下所示:
{
"server": {
"id": 123456,
"name": "srv-ubuntu-01",
"status": "running",
"created": "2021-01-11T13:04:24+00:00"
}
}
通常我可以使用 NewtonSoft.Json 和
反序列化它var server = JsonConvert.DeserializeObject<XServer>(jsonString);
使用给定 class:
public class XServer
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("name")]
public String Name { get; set; }
[JsonProperty("status")]
public String Status { get; set; }
[JsonProperty("created")]
public DateTime DateCreate { get; set; }
}
但是,在这种情况下,这不起作用,因为来自服务器的 json 响应将服务器对象保存为“子对象”((?)我不知道正确的术语) .所以我想我可以使用以下代码作为解决方法:
var def = new { server = new Object() };
var defObj = JsonConvert.DeserializeAnonymousType(jsonString, def);
var obj = JsonConvert.DeserializeObject<XServer>(defObj.server.ToString());
但这不可能,对吧?显然我缺少了一些东西……至少我是这么认为的。如前所述,欢迎任何意见,我是初学者,渴望学习 ;)
您的根对象有键 server
,它有对象 XServer
。
反序列化为 RootObject 以访问服务器对象,'XServer'。
public class RootObject {
[JsonProperty("server")]
public XServer Server {get; set;}
}
var obj = JsonConvert.DeserializeObject<RootObject>(jsonString);
XServer server = obj.Server;
===========解决方案===========
所以使用@madreflections 输入我得到了以下解决方案,它工作得很好:
public class XServerRootObject
{
[JsonProperty("server")]
public XServer Server { get; set; }
}
public class XServer
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("name")]
public String Name { get; set; }
[JsonProperty("status")]
public String Status { get; set; }
[JsonProperty("created")]
public DateTime DateCreate { get; set; }
}
使用根对象如下:
public XServer GetServer(int id)
{
var req = new RestRequest("/servers/" + id, Method.GET, DataFormat.Json);
req.AddHeader("authorization", "Bearer " + _token);
var json = _client.Get(req).Content;
var srvRoot = JsonConvert.DeserializeObject<XServerRootObject>(json);
return srvRoot.Server;
}