2015-10-27 70 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