簡體   English   中英

使用不同的字段名稱將JSON有效負載映射到DTO

[英]Map JSON payload to DTO with different field names

我有一個簡單的GitHub有效負載傳入我的ASP.NET核心應用程序,我想知道如何將我收到的有效負載映射到我的DTO。

示例DTO

public class GithubPayload
{
    public string Action { get; set; }  // action
    public string Name { get; set; }    // pull_request.title
}

示例負載

{
  "action": "deleted",
  "pull_request": {
    "title": "Fix button"
  }
}

您可以在Action上使用JsonProperty屬性,並在Name上使用可以解釋嵌套屬性的自定義轉換器。 檢查Json.Net的JsonConverter

public class GithubPayload {
    [JsonProperty("action")]
    public string Action { get; set; }
    [JsonConverter(typeof(NestedConverter), "pull_request.title")]
    public string Name { get; set; }
}

其中NestedConverter是一個自定義JsonConverter ,它將讀取嵌套屬性

public class NestedConverter : JsonConverter {
    private readonly string path;

    public NestedConverter (string path) {
        this.path = path; 
    }

    //...to do
}

更新:

使用JsonConverter轉換有效負載本身也很有效

public class GithubPayloadConverter : JsonConverter {

    public override bool CanConvert(Type objectType) {
        return objectType == typeof(GithubPayload);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
        dynamic data = JObject.Load(reader);
        var model = new GithubPayload {
            Action = data.action,
            Name = data.pull_request.title
        };
        return model;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        throw new NotImplementedException();
    }
}

並裝飾班級本身

[JsonConverter(typeof(GithubPayloadConverter))]
public class GithubPayload {
    public string Action { get; set; }
    public string Name { get; set; }
}

反序列化很簡單

string json = @"{ 'action': 'deleted', 'pull_request': { 'title': 'Fix button' } }";

var payload = JsonConvert.DeserializeObject<GithubPayload>(json);

只是一個想法:

using Microsoft.AspNetCore.Hosting;
using Newtonsoft.Json;
using System.IO;

namespace WebApplication1
{
    public class Program
    {
        public class GithubPayload
        {
            public string Action { get; set; }  // action
            public string Name { get; set; }    // pull_request.title
        }

        public static void Main(string[] args)
        {
            string json = @"{
  ""action"": ""deleted"",
  ""pull_request"": {
                ""title"": ""Fix button""
  }
        }";

            dynamic obj = JsonConvert.DeserializeObject(json);

            GithubPayload entity = new GithubPayload();
            entity.Action = obj.action;
            entity.Name = obj.pull_request.title;

            ..................
        }
    }
}

測試這個解決方案,它的工作原理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM