将多个类序列化和反序列化为一个JSON对象?没有属性标签

时间:2018-08-05 09:14:43

标签: c# json serialization json.net deserialization

我正在一个项目中尝试将代码保持为模块化。

我现在想将对象保存/加载到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”:   true}

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

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

1 个答案:

答案 0 :(得分: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中。