【问题标题】:Newtonsoft.Json - Deserialize generic object into a wrapper classNewtonsoft.Json - 将通用对象反序列化为包装类
【发布时间】:2018-07-10 17:55:05
【问题描述】:

我正在尝试开发 Asp.Net Web Api,它的响应总是

public class ApiResponse : IApiResponse, IHttpActionResult
{
    private readonly HttpRequestMessage _request;
    private readonly HttpStatusCode _statusCode;
    private readonly string _message;

    [IgnoreDataMember]
    protected Type ResponseDataType { get; set; }

    [DataMember(Name = "data")]
    public object Data { get; private set; }

    [DataMember(Name = "dataType")]
    public string DataType => this.ResponseDataType.Name;

    [DataMember(Name = "additionalMessage")]
    public string AdditionalMessage => this._message;


    public ApiResponse(HttpRequestMessage request, HttpStatusCode responseStatus, Type dataType, object data = null, string additionalMessage = null)
    {
        this._request = request;
        this._statusCode = responseStatus;

        this.ResponseDataType = dataType;
        this.Data = data;
        this._message = additionalMessage;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        HttpResponseMessage response = _request.CreateResponse(_statusCode, this);
        return Task.FromResult(response);
    }
}

如何反序列化这种响应以将Data 属性转换为DataType 类型的对象?

例如如果响应被序列化成这个Json

"dataType": "UserModel"
"data":
{
   "name" : "Bill",
   "surname" : "Lob"
}

如何使用 Newtonsoft.Json 反序列化此响应以将“object data”转换为“UserModel data”? 有什么办法吗?

【问题讨论】:

标签: c# asp.net-web-api json.net


【解决方案1】:

我已经想出了这种情况的解决方法,很简单。 在api项目的WebApiConfig.cs文件中,我添加了这行代码

config.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings() { TypeNameHandling = Newtonsoft.Json.TypeNameHandling.All };

这将添加一个名为 $type 的额外 Json 字段,反序列化程序使用该字段将通用 object Data 正确转换为 UserModel Data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 2018-06-22
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多