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

标签 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. 您需要处理 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.Position可以在他们出去后重新设置范围。 jsonToStream(rows) 现在将返回一个打开的 MemoryStream,其中包含完整的序列化 JSON 并位于开头。

sample 加工 f# fiddle .

关于json - 如何序列化以在 F# 上使用 JSON.NET 进行流式传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48119433/

相关文章:

jquery - 返回的 JSON 是函数调用的结构。不知道如何用 jQuery 解析

python - 如何在python中将json转换为csv

javascript - 在 Rails 中,如何从我的 d3 js 代码访问 json?

c# - Xamarin 应用程序通过 https 连接到 WCF 服务时出现问题

c# - 根据日期对列表进行分组,每个项目有多个日期

c# - Xamarin : @(Content) build action is not supported

javascript - 从数组中获取逗号分隔的字符串

properties - Fsharp 记录中的可选参数

f# - Freya - 如何定义带有可选查询字符串参数的 Uri 模板

.net - 签名中类型前面的 # 符号 (F#) 有何含义?