如何在C#中设置JsonProperty多个名称?

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

可以工作,但我想改为JsonProperty,就像这样

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

它失败了,我该怎么办?

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

这是否意味着,如果您在列表中有多个MyModelA实例,您希望在JSON对象中看到属性名称“ A”重复出现? JSON rfc表示:“对象中的名称应该唯一。”因此我不建议这样做。 - dbc
你是否考虑过使用TypeNameHandling = TypeNameHandling.Auto呢? - dbc
Json.NET不能直接完成这项工作。它将非字典集合序列化为JSON数组,而不是对象。此外,它并不特别支持在同一对象中重复的属性名称,而您似乎需要这样。如果您真的需要,请参考如何在同一对象中反序列化具有重复属性名称的JSON。 - dbc
谢谢您的回答,我知道我的问题所在,所以我尝试另一种方法来解决它。 - Kent
1个回答

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"
    }
}}

当存在多个相同类型的实例时,这种方法是行不通的;你会得到一个 ArgumentException,因为试图向字典中添加重复的键。 - dbc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接