【问题标题】:With Json.NET, how can I merge two C# objects that need to be serialized together?使用 Json.NET,如何将两个需要序列化的 C# 对象合并在一起?
【发布时间】:2021-10-22 11:39:06
【问题描述】:

假设我有一些我经常序列化的类,例如

public class A
{
    public A(int x, bool y)
    {
        X = x;
        Y = y;
    }

    [JsonProperty("x_thing")]
    public int X { get; }

    [JsonProperty("y_thing")]
    public bool Y { get; }
}

public class B
{
    public B(string s)
    {
        S = s;
    }

    [JsonProperty("string_thing")]
    public string S { get; }
}

如果我想从这里开始(但假装AB 是任意对象):

var obj1 = new A(4, true);
var obj2 = new B("hello world");

...那我怎样才能习惯性地生成这个 JSON 序列化呢?

{
    "x_thing": 4,
    "y_thing": true,
    "string_thing": "hello world"
}

【问题讨论】:

  • 您想将它们合并为字符串吗?
  • @gunr2171 唯一的通用解决方案是编写自己的转换器,我简直不敢相信这是最好的方法
  • @Heinzi 好主意,但我宁愿在序列化之前将每个对象转换为中间对象 - 似乎效率更高......目前正在研究 Json.NET 的 Linq.JObject
  • @AndriyShevchenko 我的意思是,我认为我必然需要将它们合并为抽象对象......?

标签: c# .net-core reflection json.net


【解决方案1】:

JObject 有一个Merge 方法:

var json1 = JObject.FromObject(obj1);
var json2 = JObject.FromObject(obj2);
json1.Merge(json2);

// json1 now contains the desired result

fiddle


如果您的对象包含同名的属性,您可以使用采用JsonMergeSettings 对象的重载来指定应如何解决冲突。

【讨论】:

  • 谢谢!我也喜欢 json1.ToObject<object>() 如果我想将其保留为对象以供以后使用/序列化(在我的情况下实际上是这样做的,因为这个组合对象最终成为 ASP.NET 控制器响应的一部分!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 2019-02-01
  • 2018-02-07
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2018-04-21
相关资源
最近更新 更多