c# - 网格中的通用 JSON 反序列化
问题描述
嗨,我在我的网格控件(复制/粘贴功能)中使用 JSON 进行反序列化项目。我想使用 JSON,因为复制粘贴必须跨应用程序域工作。
每个单元格的值类型可以不同(简单类型和复杂类型)。
class CellItem<TValue>
{
public TValue Value { get; set; }
public int GridColumnIndex { get; set; }
public int GridRowIndex { get; set; }
}
为了进行序列化,我需要获取单元格位置并存储它的值。所以我创建了一个序列化类型
public class MatrixItem
{
public int ColumnIndex { get; set; }
public int RowIndex { get; set; }
public object Value { get; set; }
}
并将它们放在一个列表中以将它们序列化到剪贴板中。这工作得很好。
现在,当我进行反序列化时,我想告诉 JSON 要反序列化哪种类型。我怎样才能做到这一点?我知道类型信息没有存储在序列化字符串中,所以我必须在代码中处理它。
我不知何故需要询问使用CellItem
哪种类型进行反序列化并让转换器知道。但我不知道该怎么做。
有类似的东西,[JsonConverter(typeof(*))]
但它需要一个编译时已知的转换器,并且转换器会在运行时改变。
解决方案
也许这可以帮助你:
假设你有一个interface
:
interface Fruit
{
bool IsSweet();
}
然后你得到了几个代表你的数据的类:
public class Apple : Fruit
{
public bool IsSweet()
{
return false;
}
}
public class Banana : Fruit
{
public bool IsSweet()
{
return true;
}
}
现在,当涉及到序列化时,您想存储类型,所以当您反序列化时,您知道它是 aBanana
还是 an Apple
。
您可以这样做JsonSerializerSettings
:
List<Fruit> fruits = new List<Fruit>();
fruits.Add(new Banana());
fruits.Add(new Apple());
JsonSerializerSettings settings = new JsonSerializerSettings();
//This is the IMPORTANT part
settings.TypeNameHandling = TypeNameHandling.All;
string json = JsonConvert.SerializeObject(fruits, settings);
将Json
如下所示:
{
"$type": "System.Collections.Generic.List`1[[YourNamespace.Fruit, YourNamespace]], mscorlib",
"$values": [
{
"$type": "YourNamespace.Banana, YourNamespace"
},
{
"$type": "YourNamespace.Apple, YourNamespace"
}
]
}
现在,当您反序列化时,您想要获取派生类型,而不是接口:只需settings
再次传递上面使用的:
var deserializedFruites = (List<Fruit>)JsonConvert.DeserializeObject(json, settings);
Count = 2
[0]: {YourNamespace.Banana}
[1]: {YourNamespace.Apple}
现在为了适应您的特定问题,我想如果您也将类型导出到 json 将是最简单的。
推荐阅读
- linker - 我们如何将 IAR Embedded Workbench 生成的输出与 4 字节(或任何其他所需值)对齐?
- ios - 为什么我不能将 GitHub 模块导入 Xcode?
- docker - iptables 如何在 docker 网络上运行
- r - 请参阅包中的内部 R 函数
- flutter - 我无法在 Ink.image 上设置 BorderRadius
- java - 如何从 RecyclerView 中的单个卡片获取编辑文本(字符串)?
- python - range() 熊猫的非空列值计数
- azure - Azure Query Performance Insights 中的 DataIO 来自哪里,当单个查询很快时
- visual-studio-code - 如何更改参数信息框字体大小?
- python - 如何以与 vcrpy 盒式磁带对 http 请求相同的方式修复流 API 的输出以用于测试目的?