【问题标题】:How to append properties of another object to a json object without copying all the properties in the target json object如何将另一个对象的属性附加到 json 对象而不复制目标 json 对象中的所有属性
【发布时间】:2017-12-09 02:56:36
【问题描述】:

所以这是场景,我有一个被序列化为 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 itef 的属性。甚至可能吗?

【问题讨论】:

  • 这样的事情对你没有好处? public string C { get { return _b.C; } set { _b.C = value; } }
  • classB 可以派生自 classA : class clasB:classA。这样classB 将具有classA 的属性
  • @PablonotPicasso 实际上 ClassA 是一个 Struct 而不是 Class 由于某些原因。因此,即使这是一个不错的选择,但很遗憾我不能这样做。
  • @RandRandom 不确定我是否明白这里的意思。
  • @tavier 看看我的回答

标签: c# .net json


【解决方案1】:

我看到了 2 个解决方案:

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 个属性,你需要的所有属性都在其中。

【讨论】:

    猜你喜欢
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2017-05-08
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多