簡體   English   中英

如何在 C# 中將自定義對象序列化為 Json

[英]How to Serialize a Custom Object to Json in C#

我有一個像下面這樣的課程

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 沒有正確序列化,它只顯示一條記錄。

我該如何解決這個問題? 我看到了可以序列化字典的示例,但是,如果它是類的成員,我如何實現類的完整序列化?

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 } } }
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM