序列化成json并作为流返回

use*_*164 0 c# stream json.net

如何将对象序列化为 json 并将其作为流返回?

我试过了:

        using (var stream = new MemoryStream())
        using (var streamWriter = new StreamWriter(stream))
        using (var jsonWriter = new JsonTextWriter(streamWriter))
        {
            var serializer = new JsonSerializer();
            serializer.Serialize(jsonWriter, obj);
            streamWriter.Flush();
            stream.Seek(0, SeekOrigin.Begin);
            return stream;
        }
Run Code Online (Sandbox Code Playgroud)

但流总是关闭的。

接下来我尝试过:

new MemoryStream(Convert.FromBase64String(JsonConvert.SerializeObject(obj)))
Run Code Online (Sandbox Code Playgroud)

但这不是注册为 base64 字符串,我觉得这种方法效率较低。

Eri*_*oft 6

Manushin 的答案是正确的,即在返回第一个片段之前不关闭流。关于您的第二个片段,base 64 编码与文本编码不同。要快速将字符串转换为内存流,可以使用Encoding.GetBytes(string)获取字节数组:

var jsonString = JsonConvert.SerializeObject(new { test = "123" });
return new MemoryStream(Encoding.Default.GetBytes(jsonString));
Run Code Online (Sandbox Code Playgroud)


Man*_*gor 5

Ask StreamWriter 不会关闭您的流。当然,避免流处理。

例如代码将是:

    var stream = new MemoryStream();
    using (var streamWriter = new StreamWriter(stream:stream, encoding:Encoding.UTF8, bufferSize:4096, leaveOpen:true)) // last parameter is important
    using (var jsonWriter = new JsonTextWriter(streamWriter))
    {
        var serializer = new JsonSerializer();
        serializer.Serialize(jsonWriter, obj);
        streamWriter.Flush();
        stream.Seek(0, SeekOrigin.Begin);
        return stream;
    }
Run Code Online (Sandbox Code Playgroud)

另一种选择 - 避免关闭流,因为你不需要它(本地资源不会在这里泄露):

    var stream = new MemoryStream();
    var streamWriter = new StreamWriter(stream)
    var jsonWriter = new JsonTextWriter(streamWriter)

    var serializer = new JsonSerializer();
    serializer.Serialize(jsonWriter, obj);
    jsonWriter.Flush();
    streamWriter.Flush();
    stream.Seek(0, SeekOrigin.Begin);
    return stream;
Run Code Online (Sandbox Code Playgroud)