Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将多个类序列化和反序列化为一个JSON对象?没有属性标记_C#_Json_Serialization_Json.net_Deserialization - Fatal编程技术网

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

C# 将多个类序列化和反序列化为一个JSON对象?没有属性标记,c#,json,serialization,json.net,deserialization,C#,Json,Serialization,Json.net,Deserialization,我正在做一个项目,我一直在努力使代码尽可能模块化 我现在想将对象保存/加载到JSON,但是我不希望每个类都保存在数百个文件中,因为我希望JSON可读,并且用户可以在一个地方轻松编辑 为了举例说明,下面是C#的一个示例: 因此,如果我将其序列化,我希望得到的结果如下: {“aNumber”:0,“aString”:“你好,世界”,“isThisObjectNice”: 真的} 因此,对于编辑json的人来说,它看起来像是一个对象,但在代码中,它仍然是一系列高度分离的部分 同样重要的是,不要使用属性

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

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

为了举例说明,下面是C#的一个示例:

因此,如果我将其序列化,我希望得到的结果如下:

{“aNumber”:0,“aString”:“你好,世界”,“isThisObjectNice”: 真的}

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

同样重要的是,不要使用属性标记将JSON与代码分开。我希望使用ContractResolver或类似工具。

假设“将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命名约定,并使用大写字母命名公共属性:
IsThisObjectNice
。如果您绝对不想使用JsonProperty属性,然后你可以在
模型中保留小写的属性名whateverjsonshouldlooklike

到目前为止你都做了些什么?@NielsNet目前我只是在用字符串构建json,这显然是非常混乱和难以维护的。在我看来,你的想法是错误的。如果您有一个要序列化的对象,那么最好有一个对linkinClass和OtherClass的引用。正如你提到的,你想把东西放在一起。我假设“让JSON与代码分离”是指让它与你的域模型分离?这是一个好主意,在您的情况下,最简单的解决方案是创建一个特殊的轻量级类,该类的外观与您希望JSON的外观完全相同,并手动将您的域对象映射到该类和从该类映射。顺便说一下,
LinkingClass
中的
linkedObject
可能与
OtherLink
类中的
linkedObject
不同-您如何选择要序列化的对象?
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
    };
}