如何将另一个对象的属性附加到json对象,而不复制目标json对象中的所有属性

时间:2017-07-05 12:25:02

标签: c# .net json

所以这是场景,我有一个被序列化为json对象的类:

public classA
{
    [JsonProperty("A")]
        public string A { get; set; }

    [JsonProperty("B")]
        public string B { get; set; }
}

我将它序列化为json字符串,如下所示:

var serializedObject = JsonConvert.SerializeObject(new classA
        {
            A = "stingAAAA",
            B = "stringBBBBB"
        });

现在,我有另一个班级:

public classB
{
    [JsonProperty("C")]
    public string C { get; set; }

[JsonProperty("D")]
    public string D { get; set; }
}

我想将ClassB对象的属性附加到正在生成的json字符串,但不将所有属性(C和D)复制到ClassA。所以基本上最后的json字符串应该处理ClassB对象的属性,就好像它们是ClassA itsef的属性一样。它甚至可能吗?

1 个答案:

答案 0 :(得分:0)

我看到了两个解决方案:

1.使用来自两个对象的值创建字典

2.用2个属性(classA和classB)创建新类

var a = new classA { A = "stingAAAA", B = "stringBBBBB" };
var b = new classB { C = "CCC", D = "DDD" };

1:

var dictA = a.GetType().GetProperties().ToDictionary(x => x.GetCustomAttributes(false).OfType<JsonPropertyAttribute>().FirstOrDefault()?.PropertyName ?? x.Name, y => y.GetValue(a));
var dictB = b.GetType().GetProperties().ToDictionary(x => x.GetCustomAttributes(false).OfType<JsonPropertyAttribute>().FirstOrDefault()?.PropertyName ?? x.Name, y => y.GetValue(b));

var result = new[] { dictA, dictB }.SelectMany(dict => dict)
                .ToDictionary(pair => pair.Key, pair => pair.Value);

var res = JsonConvert.SerializeObject(result);
// Result: {"A":"stingAAAA","B":"stringBBBBB","C":"CCC","D2":"DDD"}

2:

var newClass = new { ClassA = a, ClassB = b };
var res2 = JsonConvert.SerializeObject(newClass);
// Result: {"ClassA":{"A":"stingAAAA","B":"stringBBBBB"},"ClassB":{"C":"CCC","D2":"DDD"}}
然而,两者都有缺点。

1 - 如果classA和classB都具有相同名称的属性(或JsonPropertyAttribute),则会出现问题

2 - 你的结果将有2个属性,你需要的所有属性都在其中。