JSON序列化缺少派生类中的属性

时间:2015-11-17 04:32:23

标签: c# json

我正在使用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的值为:

  

[{\&#34; itemInt \&#34;:1,\&#34; itemString \&#34;:\&#34;第一\&#34;}]

主要缺少mainInt和mainString的值。

[DataContract]和[DataMember]标签不会改变行为,但我会在那里更改它们,以抢先找到它们缺失的答案。

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

3 个答案:

答案 0 :(得分:0)

看一下将json attribs放在你的属性上。以下是一个示例:Json.NET serialize object with root name。我唯一不愿意做的就是从列表中得到主要的东西。它不是推荐的模式和实践。 添加列表作为另一个子属性而不是从列表派生,json序列化对你的意图感到困惑。

答案 1 :(得分:0)

这是你想要的吗?

[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);
    }
}

答案 2 :(得分:0)

添加此attrib对我有用:

使用System.ComponentModel.DataAnnotations;

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