所以这是场景,我有一个被序列化为 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 个属性,您需要的所有属性都将在其中。