2015-10-27 101 views
2
[XmlElement("A", Type = typeof(MyModelA)), XmlElement("B", Type = typeof(MyModelB))] 
public List<object> context{ get; set; } 

能工作,但我想改變JsonProperty,這樣C#如何設置JsonProperty多個名稱?

[JsonProperty("A", ItemConverterType = typeof(MyModelA)), JsonProperty("B", ItemConverterType = typeof(MyModelB))] 
public List<object> context{ get; set; } 

它失敗了,我應該怎麼辦?

{ 
    node:{ 
     A:{ MyModelA } 
     B:{ MyModelB } 
     } 
} 
+0

這是否意味着,如果你有MyModelA'的'多個實例在列表中,你想看到的屬性名'「A」'在複製JSON對象? [JSON rfc](http://www.ietf.org/rfc/rfc4627.txt)說*對象內的名稱應該是唯一的*所以我不推薦它。 – dbc

+0

您是否考慮過使用['TypeNameHandling = TypeNameHandling.Auto'](http://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm)? – dbc

+0

[Json.NET不會那樣開箱](http://www.newtonsoft.com/json/help/html/SerializationGuide.htm)。它將非字典​​集合序列化爲JSON數組,而不是對象。此外,它並不特別支持您似乎需要的同一對象中的重複屬性名稱。如果你確實需要這個,你可以從[如何在同一個對象中重複序列化具有重複屬性名的JSON](http://stackoverflow.com/questions/20714160)。 – dbc

回答

0

您需要使用屬性JsonExtensionData。試試這個:

public sealed class ModuleA 
{ 
    public string Foo { get; set; } 
} 
public sealed class ModuleB 
{ 
    public string Boo { get; set; } 
} 
public class Node 
{ 
    [JsonExtensionData] 
    public Dictionary<string, JToken> Context { get; set; } 
} 
public class Example 
{ 
    public Node Node { get; set; } 
} 

var moduleA = new ModuleA {Foo = "Hello from Module A"}; 
var moduleB = new ModuleB { Boo = "Hello from Module B" }; 
var example = new Example 
     { 
      Node = new Node 
      { 
       Context = new Dictionary<string, JToken> 
       { 
        {"A", JToken.FromObject(moduleA)}, 
        {"B", JToken.FromObject(moduleB)} 
       } 
      } 
     };   

結果:

{ 
"Node": { 
    "A": { 
     "Foo": "Hello from Module A" 
    }, 
    "B": { 
     "Boo": "Hello from Module B" 
    } 
}} 
+0

當有多個相同類型的實例時,這不會起作用;你會得到一個'ArgumentException'嘗試向字典中添加一個重複鍵。 – dbc