这是代码:
public class ParameterDictionary : Dictionary<HydroObjectIdentifier, string>
{
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
) 作为字典中的键。在 JSON 中,对象键必须始终是字符串,每the spec。当 Json.Net 尝试序列化字典时,它会看到你的键是not字符串。由于它需要一个字符串,因此它只需调用ToString()
在你的课堂上。默认实现ToString()
在 C# 中返回类型的名称,在您的情况下是RSEngine.HydroObjectIdentifier
.
如果你实现自己的ToString()
方法,正如另一个答案中所建议的那样,那么您可以将密钥设置为您想要解决的问题。但是,这种方法的缺点是您无法将 JSON 反序列化回字典中。这是因为 Json.Net 没有可以使用相反的“FromString”方法将序列化键从字符串转换回标识符类。如果您需要能够使用 JSON 进行完整的往返(序列化和反序列化),那么您将需要不同的解决方案。
在 Json.Net 中,有几种可能的方法来处理复杂的字典键:
- 实施一个TypeConverter对于您的标识符类,如中所述Json.Net 序列化指南. See 如何:实现类型转换器有关详细信息,请参阅 MSDN。实现类型转换器后,您需要用
[TypeConverter]
属性,以便 Json.Net 知道使用它。
- 使用自定义JsonConverter用于更改键值对写入 JSON 的方式的字典。看如何序列化从字典派生的类有关该方法的示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)