📜  c#字典到json (1)

📅  最后修改于: 2023-12-03 15:13:53.587000             🧑  作者: Mango

C# 字典到 JSON

在 C# 中,将字典对象转换为 JSON 格式是一项很常见的任务。JSON 是一种轻量级的数据交换格式,在 Web 应用和服务中得到了广泛应用,因为它易于阅读、编写和解析。

转换方法

C# 提供了多种方法将字典对象转换为 JSON 格式,其中最流行的是使用 Newtonsoft.Json 包。下面是一个示例:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;

Dictionary<string, object> dict = new Dictionary<string, object>()
{
    { "name", "John" },
    { "age", 30 },
    { "isMarried", true },
    { "hobbies", new string[] { "reading", "gaming", "traveling" } }
};

string json = JsonConvert.SerializeObject(dict, Formatting.Indented);
Console.WriteLine(json);

该示例创建了一个 Dictionary<string, object> 对象,并使用 JsonConvert.SerializeObject() 方法将其转换为 JSON 字符串。Formatting.Indented 参数确保输出的 JSON 带有缩进和换行,使得其更易于阅读。

输出结果如下所示:

{
  "name": "John",
  "age": 30,
  "isMarried": true,
  "hobbies": [
    "reading",
    "gaming",
    "traveling"
  ]
}
自定义序列化方式

有时候,我们需要自定义字典对象的序列化方式,比如只保留字典中的某些键值对、更改键名、更改值类型等等。这时候,我们可以自定义一个类并实现 JsonConverter 接口。

以下是一个示例:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;

class CustomDictionaryConverter : JsonConverter<Dictionary<string, object>>
{
    public override void WriteJson(JsonWriter writer, Dictionary<string, object> value, JsonSerializer serializer)
    {
        writer.WriteStartObject();

        foreach (KeyValuePair<string, object> kvp in value.Where(kvp => kvp.Key != "age")) // exclude 'age' key
        {
            writer.WritePropertyName(kvp.Key == "name" ? "fullname" : kvp.Key); // rename 'name' key to 'fullname'
            serializer.Serialize(writer, kvp.Value);
        }

        writer.WritePropertyName("birthyear");
        writer.WriteValue(DateTime.Now.Year - Convert.ToInt32(value["age"])); // calculate 'birthyear' from 'age' value

        writer.WriteEndObject();
    }

    public override Dictionary<string, object> ReadJson(JsonReader reader, Type objectType, Dictionary<string, object> existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

Dictionary<string, object> dict = new Dictionary<string, object>()
{
    { "name", "John" },
    { "age", 30 },
    { "isMarried", true },
    { "hobbies", new string[] { "reading", "gaming", "traveling" } }
};

string json = JsonConvert.SerializeObject(dict, new CustomDictionaryConverter());
Console.WriteLine(json);

该示例定义了一个名为 CustomDictionaryConverter 的自定义序列化器,它将字典对象序列化成一个带有自定义键名和值类型的 JSON 字符串。在该示例中,我们将 name 键重命名为 fullname,排除了 age 键,并计算出一个新的 birthyear 值。

输出结果如下所示:

{
  "fullname": "John",
  "isMarried": true,
  "hobbies": [
    "reading",
    "gaming",
    "traveling"
  ],
  "birthyear": 1991
}
结论

在 C# 中,将字典对象转换为 JSON 格式是一个常见的任务,可以使用 Newtonsoft.Json 包轻松地实现此操作。您还可以自定义序列化器来满足更复杂的需求。该过程在大多数 Web 应用和服务中都是必不可少的。