带有父对象的C#JSON.Net CustomCreationConverter

时间:2017-05-27 01:00:07

标签: c# json json.net

如何通过反序列化提取封装在响应的data对象中的返回json响应的有效负载?

这是json的回应:

  {"data":{"status":"ok","created_at":"2017-05-26 17:34:12.224524Z","app_version":1.0,"api_version":1.0}}

我的转换器类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Converters;

namespace Sample.Models
{
    class StatusConverter : CustomCreationConverter<Status>
    {
        public override Status Create(Type objectType)
        {

            return new Status();
        }
     }
}

Status的模型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace Sample.Models
{

    class Status
    {
        [JsonProperty("app_version")]
        public string AppVersion { get; set; }

        [JsonProperty("api_version")]
        public string APIVersion { get; set; }

        [JsonProperty("status")]
        public string CurrentStatus { get; set; }

    }
}

使用RestClient

进行API调用
    public void checkConnectivityStatus()
    {
        var client = new RestClient(BaseUrl);

        var request = new RestRequest("status", Method.GET);

        IRestResponse response = client.Execute(request);
        var content = response.Content; // raw content as string
        Status status = JsonConvert.DeserializeObject<Status>(content, new StatusConverter());
        Console.Write(status.AppVersion);
    }

编辑:更新模型

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace Sample.Models
{
    public interface IStatus
    {
        string AppVersion { get; set; }

        string APIVersion { get; set; }

        string CurrentStatus { get; set; }
    }

    [JsonObject]
    class Status : IStatus
    {
        [JsonProperty("app_version")]
        public string AppVersion { get; set; }

        [JsonProperty("api_version")]
        public string APIVersion { get; set; }

        [JsonProperty("status")]
        public string CurrentStatus { get; set; }

    }
}

1 个答案:

答案 0 :(得分:1)

您只需要一个包装对象作为回应。

public class DeserializedResponse 
{
     [JsonProperty("data")]
     public Status Status { get; set; }
}

然后像这样使用它:

//var content = {"data":{"status":"ok","created_at":"2017-05-26 17:34:12.224524Z","app_version":1.0,"api_version":1.0}}

var deserializedResponse = JsonConvert.DeserializeObject<DeserializedResponse>(content);

Debug.Assert(deserializedResponse.Status.CurrentStatus == "ok");