如何序列化在F#上使用JSON.NET进行流式传输?

时间:2018-01-05 18:38:05

标签: json f# xamarin.android 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 个答案:

答案 0 :(得分:3)

您有以下问题:

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

    但是,您需要在不关闭基础流std的情况下这样做,因为您稍后会阅读它。

  2. 完成此操作后,您需要在stdsw超出范围并被处置后重置json信息流的位置。如果您在此之前尝试重置位置,那么它将无法正常工作。

  3. 因此以下内容将起作用:

    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.Position在超出范围后可以重置。 jsonToStream(rows)现在将返回一个包含完整序列化JSON的开放式MemoryStream,并位于开头。

    示例工作f# fiddle