奇怪的 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;
}