【问题标题】:(De)serializing child JSON attributes into class properties(反)将子 JSON 属性序列化为类属性
【发布时间】:2021-01-20 06:17:14
【问题描述】:

假设我有一个接受以下 JSON 的控制器:

{
    "propA": "val1",
    "propB": {
        "propC": "val2",
        "propD": "val3"
    },
    "propE": "val4"
}

不使用自定义JsonConverter,有没有办法将此JSON反序列化为一个类,例如:

public record Payload(
    string PropA,
    string PropC,
    string PropD,
    string PropE
);

JSON 对象“PropB”应该被解包,两个子属性“PropC”和“PropD”直接映射到类的对应属性。

我正在使用来自System.Text 的内置 JSON 类。

【问题讨论】:

  • 不使用自定义序列化器”定义“自定义序列化器
  • 没有自定义 de-serializer,你的意思是?不。但如果我可能会问:为什么你甚至接受这种格式的 JSON?
  • @00110001,我的意思是自定义JsonConverter
  • @metacubed 我认为自定义反序列化器可能是 的方式。毕竟,这不正是他们的用例吗?创建一个到底有什么问题? (另外,当这完全不可能时,创建一个中间 DTO 并使用自动映射器)
  • "propE", "valE" - 打错了吧?

标签: c# json asp.net-core .net-5


【解决方案1】:

您需要一个自定义的JsonConverter。使用 NewtonsoftJsonString 解析为 JsonObject,并通过 Reflection 及其名称设置 Class 属性值。

型号

public class Payload {
    public string propA { get; set; }
    public string propC { get; set; }
    public string propD { get; set; }
    public string propE { get; set; }
}

转换器

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Reflection;

    ...

    string strJSON = "{\"propA\": \"val1\",\"propB\": {\"propC\": \"val2\",\"propD\": \"val3\"},\"propE\": \"val4\"}";
    JObject jsonObject = JObject.Parse(strJSON);

    Payload payload = new Payload();
    foreach (JProperty property in jsonObject.Properties())
    {
        if (property.Value != null && payload.GetType().GetProperty(property.Name) != null)
            payload.GetType().GetProperty(property.Name).SetValue(payload, property.Value.ToString());
        else
        {
            JObject obj = (JObject)property.Value;
            foreach (JProperty prop in obj.Properties())
            {
                if (prop.Value != null)
                    payload.GetType().GetProperty(prop.Name).SetValue(payload, prop.Value.ToString());
            }
        }
    }

    Console.WriteLine("payload.propA : " + payload.propA);
    Console.WriteLine("payload.propC : " + payload.propC);
    Console.WriteLine("payload.propD : " + payload.propD);
    Console.WriteLine("payload.propE : " + payload.propE);

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2020-02-19
    • 2014-01-24
    • 2012-08-19
    • 1970-01-01
    相关资源
    最近更新 更多