gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:30:42 27 4
gpt4 key购买 nike

这是代码:

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 尝试序列化字典时,它发现您的键是不是 字符串。由于它需要一个字符串,因此它只需在您的类上调用 ToString()。 C# 中 ToString() 的默认实现返回类型的名称,在您的例子中是 RSEngine.HydroObjectIdentifier

如果您实现自己的 ToString() 方法,正如另一个答案中所建议的那样,那么您可以根据需要制作 key 来解决该问题。但是,这种方法的缺点是您将无法将 JSON 反序列化回您的字典中。这是因为没有 Json.Net 可以用来将序列化 key 从字符串转换回您的标识符类的反向“FromString”方法。如果您需要能够使用 JSON 进行完整的往返(序列化和反序列化),那么您将需要一个不同的解决方案。

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

  1. 实现 TypeConverter对于您的标识符类,如 Json.Net Serialization Guide 中所述.参见 How to: Implement a Type Converter在 MSDN 中获取详细信息。实现类型转换器后,您需要使用 [TypeConverter] 属性标记您的类,以便 Json.Net 知道如何使用它。
  2. 使用自定义 JsonConverter对于更改键值对写入 JSON 的方式的字典。参见 How To Serialize a class that derives from a Dictionary有关该方法的示例。

关于c# - Json.Net 序列化类名而不是内部属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34021338/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com