【问题标题】:How to rebuild my class hierarchy with Json.NET?如何使用 Json.NET 重建我的类层次结构?
【发布时间】:2010-08-18 14:47:02
【问题描述】:

我有一个简单的类层次结构。 Foo 是基类。 Bar 和 Baz 继承自 Foo。这些类的实例存储在一个列表中。我必须将列表序列化为 JSON。它工作得很好。但问题是将其反序列化回 List.

我将 Foos、Bars 和 Bazs 放在列表中,对其进行序列化,当我反序列化它时,我只得到 Foos :) 不过我想要我的 Bars 和 Bazs。 Json.NET 能做到吗?

using System;
using System.Collections.Generic;

using Newtonsoft.Json;

namespace JsonTest
{
  class Foo
  {
    int number;

    public Foo(int number)
    {
      this.number = number;
    }

    public int Number
    {
      get { return number; }
      set { number = value; }
    }
  }

  class Bar : Foo
  {
    string name;

    public Bar(int number, string name)
      : base(number)
    {
      this.name = name;
    }

    public string Name
    {
      get { return name; }
      set { name = value; }
    }
  }

  class Baz : Foo
  {
    float time;

    public Baz(int number, float time)
      : base(number)
    {
      this.time = time;
    }

    public float Time
    {
      get { return time; }
      set { time = value; }
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      List<Foo> fooList = new List<Foo>();
      fooList.Add(new Foo(123));
      fooList.Add(new Bar(123, "Hello, world"));
      fooList.Add(new Baz(123, 0.123f));

      string json = JsonConvert.SerializeObject(fooList, Formatting.Indented);
      List<Foo> fooList2 = JsonConvert.DeserializeObject<List<Foo>>(json);
      // Now I have only Foos in the List
    }
  }
}

【问题讨论】:

    标签: c# json serialization


    【解决方案1】:

    您正在序列化 Foos 列表,而不是 Baz 和 Bars 列表。
    我认为保持逻辑的最简单解决方案是序列化 Baz 和 Bars 列表并连接列表(这只有在您可以使用不同的顺序时才有效)。
    一般来说,使用这种设计看起来并不自然。最好有一个具有不同构造函数的类,并在字段不适用时使用 null。

    【讨论】:

    • Hm ... Bar 和 Baz 的所有字段都被序列化为 JSON。调用 JsonConvert.SerializeObject 后的 JSON 中有 Bar 的 name 字段和 Baz 的 time 字段。只有反过来是行不通的。反序列化 JSON 给了我三个 Foos。它只是忽略了特定于 Bar 和 Baz 的字段。我认为 Json.NET 可能有一个聪明的技巧(比如属性)来保持我的类层次结构。
    猜你喜欢
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多