首页 > 解决方案 > 网格中的通用 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(*))]但它需要一个编译时已知的转换器,并且转换器会在运行时改变。

标签: c#json.net

解决方案


也许这可以帮助你:

假设你有一个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 将是最简单的。


推荐阅读