如何将另一个对象的属性追加到 json 对象,而不复制目标 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的属性。甚至可能吗?

我看到 2 种解决方案:

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

2.创建具有 2 个属性(类 A 和类 B)的新类

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

阿拉伯数字:

var newClass = new { ClassA = a, ClassB = b };
var res2 = JsonConvert.SerializeObject(newClass);
// Result: {"ClassA":{"A":"stingAAAA","B":"stringBBBBB"},"ClassB":{"C":"CCC","D2":"DDD"}}

然而,两者都有缺点。

1 - 如果类 A 和类 B 都具有同名的属性(或 JsonPropertyAttribute),则会出现问题

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

最新更新