gpt4 book ai didi

c# - 将 JSON 负载映射到具有不同字段名称的 DTO

转载 作者:行者123 更新时间:2023-11-30 14:23:19 26 4
gpt4 key购买 nike

我有一个简单的 GitHub 负载传入我的 ASP.NET Core 应用程序,我想知道如何将我收到的负载映射到我的 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);

关于c# - 将 JSON 负载映射到具有不同字段名称的 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45957277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com