【问题标题】:Serializing and Deserializing multiple classes into one JSON object? Without attribute tags将多个类序列化和反序列化为一个 JSON 对象?没有属性标签
【发布时间】:2018-08-05 09:14:43
【问题描述】:

我正在从事一个项目,我一直在努力使代码尽可能模块化。

我现在想将对象保存/加载到 JSON,但是我不希望每个类都保存在数百个文件中,因为我希望 json 在一个地方为用户可读且易于编辑。

为了举例,这里是一个 C# 示例:

 public class ObjectToBeSerialized
 {
     public float aNumber;
 }

 public class LinkingClass
 {
     public ObjectToBeSerialized linkedObject;
     public string aString;
 }

 public class OtherLink
 {
     public ObjectToBeSerialized linkedObject;
     public bool isThisObjectNice;
 }

所以如果我序列化这个,我正在寻找的结果会是这样的:

{ "aNumber": 0, "aString": "Hello World", "isThisObjectNice": 真的}

因此,对于编辑 json 的人来说,它看起来像是 一个 对象,但在代码中它仍然是高度分离的一系列部分。

同样重要的是不要使用属性标签将 JSON 与代码分开。我正在寻找使用 ContractResolver 或类似的工具。

【问题讨论】:

  • 到目前为止你有什么尝试?
  • @NielsNet 目前我基本上只是在构建 json 字符串,这显然非常混乱且难以维护。
  • 在我看来你的想法是错误的。如果你有一个你想要序列化的对象,那么你最好有一个对 linkinClass 和 OtherClass 的引用。正如你提到的,你想把事情放在一起。
  • 我假设“将 JSON 与代码分开”是指将其与域模型分开?这是一个好主意,在您的情况下,最简单的解决方案是创建一个特殊的轻量级类,该类看起来完全符合您希望 JSON 的外观,并手动将您的域对象映射到此类。
  • 顺便说一下,LinkingClass 中的linkedObject 可能与OtherLink 类中的linkedObject 不同——你如何选择序列化哪一个?

标签: c# json serialization json.net deserialization


【解决方案1】:

假设“将 JSON 与代码分开”意味着您希望将域模型与任何 JSON 序列化问题分开,我认为这是一个好主意。最简单的方法是引入一个轻量级类来对输出进行建模,以及一个映射函数:

public class ModelOfWhateverJsonShouldLookLike
{
    public float aNumber { get; set; }
    public string aString { get; set; }
    public bool isThisObjectNice { get; set; }
}

public static ToJsonModel(LinkingClass linkingObject, OtherLink otherLinkObject)
{
    return new ModelOfWhateverJsonShouldLookLike
    {
        aNumber = linkingObject.aNumber, // otherLinkObject.aNumber?
        aString = linkingObject.aString,
        isThisObjectNice = otherLinkObject.isThisObjectNice
    };
}

在序列化之前,您必须简单地调用映射函数而不是序列化您的域对象。

这种方法的优点是透明和简单:很容易准确地看到正在序列化的内容并在出现问题时调试映射函数。使用更“神奇”的方法,例如ContractResolver,可能会节省一些带有较大对象的样板文件,但当出现问题时会变得非常痛苦(并且会浪费时间)。

不相关的说明:我建议在 C# 代码中坚持 C# 命名约定并使用 UpperCamelCase 命名公共属性:IsThisObjectNice。如果您绝对不想使用 JsonProperty 属性,则可以将小写的属性名称保留在 ModelOfWhateverJsonShouldLookLike 中。

【讨论】:

    猜你喜欢
    • 2014-01-24
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    相关资源
    最近更新 更多