这是代码:
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而不是类的名称。
您看到此行为的原因是因为您使用复杂的对象(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派生的类。