繁体   English   中英

C#JSON.Net CustomCreationConverter与父对象

[英]C# JSON.Net CustomCreationConverter with parent object

如何通过反序列化提取封装在响应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; }

    }
}

您只需要一个包装对象即可。

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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM