如何在C#中将List序列化为Json字符串?


JavaScript 对象表示法 (JSON) 广泛用于跨不同系统和应用程序存储、传输和通信数据。其简单的语法和表示复杂数据结构的能力使其成为 Web 服务和 API 的理想选择。

为了便于将数据转换为 JSON 格式,C# 通过流行的库(例如System.Text.Json和Newtonsoft.Json. 在本文中,我们将讨论其中一些技术,我们可以使用这些技术在 C# 中将列表序列化为 JSON。

使用 System.Text.Json 将list列表序列化为 JSON
.NET 中的命名空间System.Text.Json提供了一些我们可以用来处理 JSON 数据的功能。

要开始使用这些功能在 C# 中将列表序列化为 JSON,我们首先定义一个SerializeListToJsonWithSystemTextJson类和一个_clubList变量:

public class SerializeListToJsonWithSystemTextJson
{
    private readonly List<Club> _clubList;

    public SerializeListToJsonWithSystemTextJson(List<Club> clubList)
    {
        _clubList = clubList;
    }
}

在这里,我们定义了一个类,它将包含所有利用System.Text.Json库的方法。接下来,我们定义一个私有的只读变量,指向我们要序列化为JSON的列表。

然后我们定义一个构造函数,将_clubList的值设置为clubList。当我们想调用这个类中定义的方法时,我们可以使用这个构造函数来设置_clubList的值。

好了,我们现在可以讨论在C中使用System.Text.Json命名空间将一个列表序列化为JSON的不同方法。

1、Serialize()

public string SerializeMethod()
{
    return JsonSerializer.Serialize(_clubList);
}

在这个方法中,我们从JsonSerializer类中调用Serialize()方法,将我们想要序列化的List<T>对象作为参数传入。

2、 SerializeToUtf8Bytes()

public string SerializeToUtf8BytesMethod()
{
    var result = JsonSerializer.SerializeToUtf8Bytes(_clubList, _options);

    return System.Text.Encoding.UTF8.GetString(result);
}

首先,我们调用JsonSerializer.SerializeToUtf8Bytes()方法,传入两个参数。第一个参数是List对象_clubList,第二个参数是_options,是本文前面创建的JsonSerializerOptions类的一个实例。我们使用这些选项来控制生成的JSON字符串的格式,例如确保它是可读的,并且属性名称是骆驼字母。

一旦序列化完成,我们就会获得生成的字节数组,并使用System.Text.Encoding.UTF8.GetString()方法将其转换为字符串。在这里,我们将字节数组作为一个参数传入,该方法返回一个UTF-8编码的字符串。

用Newtonsoft.Json将list列表序列化为JSON文件
到目前为止,我们已经看到了如何使用本地System.Text.Json库将一个列表序列化为JSON。但是等等--还有更多。让我们看看其他一些技术,我们可以在C中使用Newtonsoft.Json库将一个列表转换为JSON。

首先,让我们定义一个SerializeListToJsonWithNewtonsoftJson类和一个_clubList变量:

public class SerializeListToJsonWithNewtonsoftJson
{
    private readonly List<Club> _clubList;

    public SerializeListToJsonWithNewtonsoftJson(List<Club> clubList)
    {
        _clubList = clubList;
    }
}

在这里,我们创建一个类,它将包含所有利用Newtonsoft.Json库的方法。然后我们定义一个私有的只读变量,指向我们要序列化为JSON的列表。

之后,我们定义一个构造函数,将_clubList的值设置为clubList。当我们想调用这个类中定义的方法时,我们可以使用这个构造函数来设置_clubList的值。

接下来,通过定义JsonSerializerSettings类的一个实例,确保我们的方法以可读的格式返回JSON字符串,并确保属性名称是骆驼字母:

private readonly JsonSerializerSettings _settings = new()
{
    Formatting = Formatting.Indented,
    ContractResolver = new DefaultContractResolver { NamingStrategy = new CamelCaseNamingStrategy() },
};

在这个例子中,我们初始化了两个设置。首先,我们将格式化属性设置为Formatting.Indented。设置这个会使返回的JSON字符串缩进,以提高可读性。

然后,我们将ContractResolver属性设置为DefaultContractResolver类的一个实例。有了它,当我们将我们的列表序列化为JSON时,它会自动将属性名称转换为骆驼字母。在这里,我们将DefaultContractResolver的NamingStrategy属性设置为CamelCaseNamingStrategy的一个实例。我们这样做是为了在序列化过程中把属性名称转换为驼峰大写。

现在,让我们探索一下我们可以使用这个库将一个列表序列化为JSON的各种方法。

用JsonConvert.SerializeObject()方法将一个list列表序列化为JSON。
有了这些,我们来探讨一下如何使用JsonConvert.SerializeObject()方法将一个列表序列化为JSON。

首先,让我们定义一个SerializeObjectMethod()方法:

public string SerializeObjectMethod()
{
    return JsonConvert.SerializeObject(_clubList, _settings);
}

这里,我们调用JsonConvert.SerializeObject()方法,并传入两个参数。第一个参数是我们要序列化的列表对象,第二个参数是我们创建的JsonSerializerSettings类的实例。

用JsonSerializer类将list列表序列化为JSON
我们还没有完成。让我们讨论一下如何使用JsonSerializer类来将List<T>对象转换为JSON:

public string JsonSerializerClass()
{
    var serializer = JsonSerializer.Create(_settings);
    var stringBuilder = new StringBuilder();
    using (var writer = new JsonTextWriter(new StringWriter(stringBuilder)))
    {
        serializer.Serialize(writer, _clubList);
    }

    return stringBuilder.ToString();
}

在JsonSerializerClass()方法中,我们通过传入_settings对象作为参数,创建了一个JsonSerializer类的实例。我们将使用这个实例将我们的列表序列化为JSON。

接下来,我们创建一个新的StringBuilder对象,它将存储我们的JSON字符串。然后我们使用JsonTextWriter实例将我们序列化的JSON字符串写到StringBuilder中。

在using语句中,我们将JsonTextWriter实例和我们的列表对象_clubList作为参数传递给serializer.Serialize()方法并调用它。这个方法将我们的_clubList序列化为一个JSON字符串,我们将其写入StringBuilder中。

最后,我们通过调用ToString()方法从StringBuilder返回JSON字符串。

在C#中序列化一个list列表的最快方法是什么?
在我们所有的方法准备好后,让我们使用BenchmarkDotNet库来测量每个方法的时间性能和内存分配。

最快方法是调用SerializeMethod()方法。
在所有测试方法中,此方法使用的内存最少。

SerializeToUtf8BytesMethod()方法比SerializeMethod()方法稍慢,分配的内存更多。

JsonSerializerClass()方法和SerializeObjectMethod()方法都比基于System.Text.Json的方法慢。然而,它们都分配了相同数量的内存。

总的来说,很明显,当我们想在C中把一个列表序列化为JSON时,最理想的选择是利用SerializeMethod()方法。