如何从json创建具有不同对象类型的列表

RBE

我想从 json 创建一个不同对象类型(具有相同的父对象)的列表。

我有一些模型

public class Quote
{
    public virtual ICollection<QuoteLine> QuoteLines { get; set; }
}

public class QuoteLine
{
    public int Order { get; set; }
}

public class A : QuoteLine
{
    public string PropertyA { get; set; }
}

public class B : QuoteLine
{
    public string PropertyB { get; set; }
}

一个报价有一个 QuoteLines 的集合,可以是 A 或 B 类型

我可以做这样的事情

Quote quote = new Quote{
    QuoteLines = new List<QuoteLine>{
        new A { Order = 1, PropertyA = "propA"},
        new B { Order = 2, PropertyB = "propB"},
    }
}

我想以另一种方式做到这一点,我有一个这样的 Json(从 HttpClient.GetAsync() 返回)

{"quoteLines":[
    {"order":1,"propertyA":"propA"},
    {"order":2,"propertyB":"propB"}
]}

当我将它反序列化为 Quote 时,我失去了 children 属性。我明白这是因为我有一个类型为 QuoteLine 的集合,所以子属性不会反序列化。但我正在寻找一种方法来保留所有信息。

我正在打的电话:

    public async Task<Quote> GetById(int id)
    {
        Quote quote = null;

        HttpResponseMessage response = await httpClient.GetAsync(new StringBuilder(controllerName).Append("/").Append(id).ToString());
        if (response.IsSuccessStatusCode)
        {
            quote = await response.Content.ReadAsAsync<Quote>();
        }

        return quote;
    }

谢谢你的帮助。

RBE

我找到了一个更好的解决方案,它不会在 json 中公开命名空间和应用程序集。

仅在客户端应用程序中。我添加了一个自定义的 JsonConverter:

public abstract class JsonCreationConverter<T> : JsonConverter
    where T : class
{
    public override bool CanWrite
    {
        get
        {
            return false;
        }
    }

    protected abstract T Create(Type objectType, JObject jObject);

    public override bool CanConvert(Type objectType)
    {
        return typeof(T).IsAssignableFrom(objectType);
    }


    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader == null) throw new ArgumentNullException("reader");
        if (serializer == null) throw new ArgumentNullException("serializer");
        if (reader.TokenType == JsonToken.Null)
            return null;

        JObject jObject = JObject.Load(reader);
        T target = Create(objectType, jObject);
        serializer.Populate(jObject.CreateReader(), target);
        return target;
    }

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

对于派生的每个实体:

public class QuoteLineJsonConverter : JsonCreationConverter<QuoteLine>
{
    protected override QuoteLine Create(Type objectType, JObject jObject)
    {
        if (jObject == null) throw new ArgumentNullException("jObject");
        string discriminator = jObject.GetValue("Discriminator", StringComparison.OrdinalIgnoreCase)?.Value<string>();
        if (discriminator != null)
        {

            switch (discriminator)
            {
                case "A":
                    return new A();
                case "B":
                    return new B();
                default:
                    return new QuoteLine();
            }
        }
        else
        {
            return new QuoteLine();
        }
    }
}

我只需要在我的模型中添加一个数据属性来触发自定义转换器

[JsonConverter(typeof(QuoteLineJsonConverter))]
public class QuoteLine
{
    public int Order { get; set; }
}

小心 jquery ajax 请求,您需要将数据作为 Json 发送以调用自定义 JsonConverter。

        $.ajax({
            url: "myUrl",
            type: "post",
            cache: false,
            data: JSON.stringify(data),
            dataType: "json",
            contentType: "application/json; charset=utf-8"
        });

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何创建使用具有使用Java流性质不同的对象列表中不同对象的列表

如果hashcode()根据对象的地址创建哈希码,那么具有相同内容的两个不同对象如何创建相同的哈希码?

如何创建具有不同引用的相同对象的副本?

创建具有相同基本类型的不同对象。工厂模式?

MapStruct-将具有不同对象类型的两个列表映射到具有另一种对象类型的第三个列表

如何创建具有N个-1个相等对象+ 1个不同对象的List <T>?

通过从列表中删除一个对象(具有重复对象的不同对象)来创建新的非重复列表

如何获取json中每个对象的级别,其中对象可以具有任意数量的相同对象类型的子对象

如何反序列化具有包含不同对象的属性的json?

创建不同对象的列表副本

Javscript从具有相同属性,具有相同键和添加量的不同对象创建公共对象

如何在Swift中使用Codable解码具有不同对象的JSON数组?

如何使onBindViewHolder在单个适配器中允许不同对象类型的列表?

比较2个具有不同对象的列表Java返回不匹配的列表

json模式如何代表具有不同对象的数组?

比较不同对象但具有相同字段的2个列表

如何从其中具有相同对象的实体获取对象列表?-iOS

如何将值从一个列表复制到另一个具有不同对象的列表

具有不同对象方法的Mongoose多类型架构

为每个键值反序列化具有不同对象类型的JSON文件

如何为不同对象的列表类型配置有效负载类型路由器?

对具有不同对象的数组列表进行排序

Java Parse Json 与具有不同对象类型(Gson 或 Jackson 等)的数组

如何从不同对象的返回结果创建对象的强制类型

如何创建托管项目列表、实现接口但具有不同类型参数的类型?

如何将具有唯一字段的两个不同对象列表合并到一个单独的列表中?

如何使用 Codable 解析不同对象列表的 Json 数组?

如何对具有不同对象的数组中的所有值使用 .some()

如何创建具有不同数据类型的 JSON?