当前位置:  开发笔记 > 编程语言 > 正文

Json.Net序列化类名而不是内部属性

如何解决《Json.Net序列化类名而不是内部属性》经验,为你挑选了1个好方法。

这是代码:

public class ParameterDictionary : Dictionary
{

    public void WriteToJson(string jsonFilePath)
    {
        string json = Newtonsoft.Json.JsonConvert.SerializeObject(this, formatting: Newtonsoft.Json.Formatting.Indented);
        System.IO.File.WriteAllText(jsonFilePath, json);
    }

}

public struct HydroObjectIdentifier
{

    public string Name { get; set; }
    public string TypeName { get; set; }

    public HydroObjectIdentifier(string name, string typeName)
    {
        this.Name = name;
        this.TypeName = typeName;
    }

}

...这就是Json的结果。请注意,它显示的是类名RSEngine.HydroObjectIdentifier而不是其参数,这在我的代码中不是预期的。

{
  "RSEngine.HydroObjectIdentifier": [
    {
      "myString"
    },
    ...

如注释中所述,预期的行为是将Name和TypeName写入json而不是类的名称。



1> Brian Rogers..:

您看到此行为的原因是因为您使用复杂的对象(HydroObjectIdentifier)作为Dictionary中的键。在JSON中,根据规范,对象键必须始终为字符串。当Json.Net尝试序列化字典时,它会发现您的密钥不是字符串。由于它需要一个字符串,因此只需调用ToString()您的类。ToString()C#中的默认实现返回类型的名称,在您的情况下为RSEngine.HydroObjectIdentifier

如果您实现自己的ToString()方法(如另一个答案中所建议),则可以随心所欲地解决问题。但是,这种方法的缺点是您将无法将JSON反序列化回字典中。这是因为Json.Net不能使用相反的“ FromString”方法来将序列化的密钥从字符串转换回标识符类。如果您需要使用JSON(序列化和反序列化)进行完整往返,那么您将需要其他解决方案。

在Json.Net中,有两种可能的方法来处理复杂的字典键:

    TypeConverter如Json.Net序列化指南中所述,为您的标识符类实现。有关详细信息,请参见如何:在MSDN中实现类型转换器。在实现类型转换器之后,您将需要使用[TypeConverter]属性标记类,以便Json.Net知道要使用它。

    JsonConverter对字典使用自定义,可更改将键值对写入JSON的方式。有关该方法的示例,请参见如何序列化从Dictionary派生的类。

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有