如何在 F# 上使用 JSON.NET 进行序列化流式处理



我需要将JSON发送到WebResourceResponse

override this.ShouldInterceptRequest(view:WebView, request:IWebResourceRequest) =
    let rows = Customer.fakeData 1 // Array of records
    let st = Shared.jsonToStream(rows)
    new WebResourceResponse("application/javascript", "UTF-8", st)

但不要看到如何做到这一点。我使用 Json.NET 和 F#。

当我运行时:

let jsonToStream(value:'T) =
    let serializer = new JsonSerializer()
    let std = new IO.MemoryStream()
    let sw = new IO.StreamWriter(std)
    let json = new JsonTextWriter(sw)
    serializer.Serialize(json, value)
    //std.Position <- 0L
    std

响应以空白字符串的形式返回。

您有以下问题:

  1. 您需要释放StreamWriterJsonTextWriter,以便将序列化的 JSON 刷新到基础流。 这可以通过将let替换为 use .

    但是,您需要这样做 不关闭基础流std ,因为您稍后将从中读取。

  2. 这样做后,您需要在swjson超出范围并被释放后重置std流的位置。 如果您尝试在之前重置位置,那么它将不起作用。

因此,以下内容将起作用:

let jsonToStream(value:'T) =
    let serializer = new JsonSerializer()
    let std = new IO.MemoryStream()
    (   use sw = new StreamWriter(std, new UTF8Encoding(false, true), 1024, true)
        use json = new JsonTextWriter(sw, CloseOutput = false)
        serializer.Serialize(json, value))
    std.Position <- 0L
    std

请注意,使用括号来限制swjson的范围,以便在超出范围后可以重置std.PositionjsonToStream(rows)现在将返回一个打开的MemoryStream,其中包含完整的序列化 JSON,并位于开头。

工作 f# 小提琴示例。

相关内容

  • 没有找到相关文章

最新更新