c# - 如何在 C# 中将自定义对象序列化为 Json
问题描述
我有一个像下面这样的课
public class CustomObject
{
public string param1;
public IEnumerable<ExampleClass1> param2;
public Dictionary<ExampleClass1, IEnumerable<ExampleClass2>> param3;
//Constructor of the class with values set.
}
public class ExampleClass1
{
public string example1String;
public int example1Int;
//Constructor of the class with values set.
}
public class ExampleClass2
{
public string example2String;
public int example2Int;
//Constructor of the class with values set.
}
输入 :
CustomObject
param1 : "abc"
param2 : List<ExampleClass1>
{abc1,1}
{abc2,2}
param3 : Map<ExampleClass1, List<ExampleClass2>>
<{abc1,1},[{xyz1,2},{xyz2,2}]>
<{abc2,2},[{xyz3,3},{xyz4,4}]>
输出 :
param1 : "abc"
param2 : {abc1,1}
{abc2,2}
param3 :<{abc1,1},[{xyz1,2},{xyz2,2}]>
预期产出
param1 : "abc"
param2 : {abc1,1}
{abc2,2}
param3 :{abc1,1},[{xyz1,2},{xyz2,2}]
{abc2,2},[{xyz3,3},{xyz4,4}]
我想序列化这个类并使用下面的方法将对象序列化为 json 字符串。
var serializedContent = JsonConvert.SerializeObject(CustomObject);
param1 和 param2 的输出是正确的,但 param3 没有正确序列化,它只显示一条记录。
我该如何解决这个问题?我看到了可以序列化 Dictionary 的示例,但是,如果它是 Class 的成员,我如何实现该类的完整序列化?
解决方案
看看这个具体在CustomObject
:
public Dictionary<ExampleClass1, IEnumerable<ExampleClass2>> param3;
你设置了一个地图,关键是一个类。在键是对象的情况下,地图如何工作?它没有。您必须指定该类的“值”。一个快速的方法是覆盖ToString
.
所以试试这个:
public class ExampleClass1
{
public string example1String;
public int example1Int;
public override string ToString()
{
return example1String;
}
}
请记住,创建ExampleClass1
一个键,您必须确保不ExampleClass1
存在具有相同值的其他键,否则您的 JSON 中将有重复的键,这使得分析变得困难。
警告:我不知道如何将它反序列化回实际对象,因为它无法将字符串转换为ExampleClass1
. 你可能不得不做一些愚蠢的事情,你对你的数据做一个复合键,然后制作一个自定义的 JSON 转换器来反序列化它。
我对您的建议是,当您想序列化到 JSON 或从 JSON 序列化时,不要使用类作为映射键。
ETA:我用于测试的数据:
var cobj = new CustomObject
{
param1 = "abc",
param2 = new ExampleClass1[]
{
new ExampleClass1 { example1String = "abc1", example1Int = 1 },
new ExampleClass1 { example1String = "abc2", example1Int = 2 }
},
param3 = new Dictionary<ExampleClass1, IEnumerable<ExampleClass2>>
{
{ new ExampleClass1{ example1String = "abc1", example1Int = 1 }, new ExampleClass2[] { new ExampleClass2 { example2String = "xyz1", example2Int = 2 }, new ExampleClass2 { example2String = "xyz2", example2Int = 3 } } },
{ new ExampleClass1{ example1String = "abc2", example1Int = 4 }, new ExampleClass2[] { new ExampleClass2 { example2String = "xyz3", example2Int = 5 }, new ExampleClass2 { example2String = "xyz4", example2Int = 6 } } }
}
};
推荐阅读
- facebook - 需要检查是否允许 Facebook 进行关注?
- python - 如何从 Python 和 Airflow 中的任务中获取 DAG 信息
- c# - radgridview (telerik winforms) 接受数字
- .net - 无服务器:在部署之前运行测试
- python-3.x - Python网络抓取文本,垂直打印
- r - Unix 运行命令没有为 R 脚本生成日志
- python - keras Tokenizer 在整个数据帧上的使用
- backup - 我可以从备份 DAT 文件中恢复设置密钥吗?
- python - 在自动地图上定义关系的问题
- node.js - 在 Electron 应用程序中运行多个 nodejs 服务器