首页 > 解决方案 > 如何在 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 的成员,我如何实现该类的完整序列化?

标签: c#json

解决方案


看看这个具体在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 } } }
    }
};

推荐阅读