我正在一个项目中尝试将代码保持为模块化。
我现在想将对象保存/加载到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或类似工具。
答案 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
中。