【问题标题】:JSON serialization missing properties in derived classJSON序列化在派生类中缺少属性
【发布时间】:2015-11-17 04:32:22
【问题描述】:

我正在使用 Newtonsoft JSON 序列化程序,如果类是从列表派生的,则序列化字符串缺少派生类的属性。这是我的示例代码。

类:

[DataContract]
public class TestItem
{
    [DataMember]
    public int itemInt;
    [DataMember]
    public string itemString;

    public TestItem() {}
    public TestItem(int _intVal, string _stringVal)
    {
        itemInt = _intVal;
        itemString = _stringVal;
    }
}

[DataContract]
public class TestMain : List<TestItem>
{
    [DataMember]
    public int mainInt;
    [DataMember]
    public string mainString;
}

序列化代码:

string test;

// Test classes
TestMain main = new TestMain();
main.mainInt = 123;
main.mainString = "Hello";
main.Add(new TestItem(1, "First"));

test = Newtonsoft.Json.JsonConvert.SerializeObject(main);

序列化后test的值为:

[{\"itemInt\":1,\"itemString\":\"First\"}]

mainInt 和 mainString 的值完全丢失。

[DataContract] 和 [DataMember] 标签不会改变行为,但我将它们放在其中,以抢占它们丢失的答案。

如何让 JSON 识别和序列化派生类的 mainInt 和 mainString 属性?

【问题讨论】:

    标签: c# json


    【解决方案1】:

    这是你想要的吗?

    [DataContract]
    public class TestItem
    {
        [DataMember]
        public int itemInt { get; set; }
        [DataMember]
        public string itemString { get; set; }
    
        public TestItem() { }
        public TestItem(int _intVal, string _stringVal)
        {
            itemInt = _intVal;
            itemString = _stringVal;
        }
    }
    
    [DataContract]
    public class TestMain
    {
        [DataMember]
        public int mainInt { get; set; }
        [DataMember]
        public string mainString { get; set; }
        [DataMember]
        public List<TestItem> TestItem = new List<TestItem>();
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            string test;
    
            // Test classes
            TestMain main = new TestMain();
            main.mainInt = 123;
            main.mainString = "Hello";
            main.TestItem.Add(new TestItem(1, "First"));
            test = Newtonsoft.Json.JsonConvert.SerializeObject(main);
            Console.WriteLine(test);
        }
    }
    

    【讨论】:

    • 这将解决 JSON 问题,但不幸的是我们不能这样做。现有的第 3 方代码使用 TestMain 类,因此无法修改 TestMain 类以将列表作为属性。 TestMain 必须保持继承自 List.
    • 那么你可以修改TestItem类吗?
    • 不,我们不能修改任何类。 :(
    【解决方案2】:

    看看将 json 属性放在你的属性上。这是一个示例:Json.NET serialize object with root name。我唯一不愿做的就是让 main 派生自这样的列表。它不是推荐的模式和做法。 将列表添加为另一个子属性,而不是从列表派生,json serialize 对您的意图感到困惑。

    【讨论】:

    • 好主意,但还是不行。一旦我将 TestMain 标记为 JsonObject,mainInt 和 mainString 就会通过,但列表项不会!
    • 将列表作为 TestMain 的属性将是一个解决方案(JSON 可以正常工作),但不幸的是,这会影响我们无法控制的其他代码 - 有使用这些的第 3 方代码类,派生自 List.
    【解决方案3】:

    添加此属性对我有用:

    使用 System.ComponentModel.DataAnnotations;

    [Newtonsoft.Json.JsonObject(Title = "root")] 公共类Testmain:列表

    【讨论】:

    • 谢谢,[JsonObject] 帮助我获得了要序列化的派生类。但是它序列化了所有的东西,甚至是基类中最初没有序列化的东西,所以对我来说,缺少的属性上的 [JsonProperty] 对我有用。
    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-31
    • 2015-08-23
    • 1970-01-01
    相关资源
    最近更新 更多