2015-11-17 34 views
5

Newtonsoft JSONシリアライザを使用しています。クラスがリストから派生している場合は、シリアル化された文字列に派生クラスのプロパティがありません。ここに私のコード例があります。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); 

シリアライゼーション後、試験の値は:

[{\ "itemInt \":1、\」 itemString \ ":\" First \ "}]

mainIntとmainStringの値が完全に欠落しています。

[DataContract]タグと[DataMember]タグで動作は変更されませんが、そこにはそれらがあり、欠落しているという回答を先取りしています。

派生クラスのmainIntプロパティとmainStringプロパティをJSONで認識してシリアル化するにはどうすればよいですか?

答えて

0

jsonの属性をプロパティに設定します。サンプルはJson.NET serialize object with root nameです。私が躊躇する唯一のことは、そのようなリストからメインを派生させることです。それは推奨されるパターンと実践ではありません。 リストから派生するのではなく、リストを別の子プロパティとして追加すると、json serializeはあなたの意図について混乱してしまいます。

+0

良いアイデアが、それでも動作しません。 TestMainをJsonObjectとしてタグ付けすると、mainIntとmainStringが渡されますが、リスト項目は表示されません。 – user1961169

+0

TestMainのプロパティとしてリストを用意することは解決策です(JSONはそれでうまくいきます)。残念ながら、私たちが制御できない他のコードに影響を与えます - これらのクラスをそのまま使用する第三者コードがありますリスト<> – user1961169

0

これは必要なものですか?このATTRIBを追加

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

これはJSONの問題を解決しますが、残念ながらこれを行うことはできません。既存の第三者コードはTestMainクラスを使用するため、TestMainクラスはリストをプロパティとして持つように変更することはできません。 TestMainはリストから派生したままでなければなりません。 – user1961169

+0

これでTestItemクラスを変更できますか? – MichaelMao

+1

いいえ、クラスを変更することはできません。 :( – user1961169

0

は私の作品:

System.ComponentModel.DataAnnotationsを使用して、

[Newtonsoft.Json.JsonObject(タイトル= "ルート")] パブリッククラスいるTestMain:リスト

+0

[JsonObject]は派生クラスをシリアル化するために私のために働いていましたが、元々シリアル化されていなかった基本クラスのものもすべてシリアル化していましたので、代わりに[JsonProperty]私。 – Andy

関連する問題