【问题标题】:Serialize a list of derived list [duplicate]序列化派生列表的列表[重复]
【发布时间】:2016-09-09 08:53:01
【问题描述】:

我找不到用 JSON.NET 序列化派生列表的方法,我开始怀疑它是否可能。让我用一些代码来解释一下情况。

我创建了一个从特定对象列表派生的新类(首先尝试使用通用对象)并添加了一个字符串属性NomGroupe

public class GroupeActes : List<Acte>
{
    public string NomGroupe { get; set; }

    public GroupeActes(string nom, List<Acte> liste)
    {
        NomGroupe = nom;

        foreach (var acte in liste)
        {
            this.Add(acte);
        }
    }
}

然后,在我的代码中,我声明了一个此类 (List&lt;GroupeActes&gt; listOfGroupeActes) 的列表,并用数据填充它。对于序列化,我使用以下代码:

        JsonSerializer serializer = new JsonSerializer();
        serializer.TypeNameHandling = TypeNameHandling.All;
        using (StreamWriter sw = new StreamWriter(@"listOfGroupeActes.json"))
        using (JsonWriter writer = new JsonTextWriter(sw))
        {
            serializer.Serialize(writer, listOfGroupeActes);
        }

我尝试过使用和不使用 TypeNameHandling.All 参数,以及 Json.net 属性的几种组合,甚至使用 DataContract/DataMember。

到目前为止,我只设法在我的 json 文件中获取每个嵌套 List&lt;Acte&gt; 的数据,而没有 NomGroupe 属性,或者相反。但不是两者都有,这是我想要的。

那么两个问题:

  • 有可能吗?
  • 如果是,我该怎么做?

感谢您的帮助!

【问题讨论】:

标签: c# json json.net


【解决方案1】:

You don't want to inherit from List&lt;T&gt;.

改为创建一个列表属性:

public class GroupeActes
{
    public List<Acte> Actes { get; set; }

    public string NomGroupe { get; set; }

    public GroupeActes(string nom, List<Acte> liste)
    {
        NomGroupe = nom;

        Actes.AddRange(acte);           
    }
}

列表(和其他集合类型)在序列化时得到特殊处理。您不希望输出中包含集合类型的公共属性(例如 CapacityCount),因此您通过继承添加的属性也不会被序列化。

一个集合是这样序列化的:

if o is IEnumerable
    foreach object s in o
        serialize o

因此,序列化程序甚至不会查看您的可枚举属性。

【讨论】:

  • 遗憾的是,我需要从列表中继承,以便在 Xamarin.Forms 项目link 中分组到列表视图中。所以你是说用 JSON.NET 序列化这样的对象根本不可能?
  • 你的序列化和列表显示有关系吗?如果没有,请使用上面的类进行序列化,并将其映射到您的问题中以进行显示。
  • 我打算只使用序列化来存储数据。所以,是的,如果 JSON.NET 不能做到这一点,这就是我要使用的解决方案。谢谢,我会接受你的回答。
【解决方案2】:

尝试使用 Newtonsoft Json.NET

string itemToSend = JsonConvert.SerializeObject(dataModel);

【讨论】:

  • 不,可悲的是,问题是一样的。然后忽略 NomGroupe 属性。
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 2013-10-10
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多