我需要将 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
响应返回一个空字符串。
最佳答案
您有以下问题:
您需要处理
StreamWriter
和JsonTextWriter
,以便将序列化的 JSON 刷新到底层流。这可以通过将let
替换为use
来完成.但是,您需要在不关闭底层流
std
的情况下执行此操作,因为稍后您将读取它。完成后,您需要在
sw
和json
超出范围后重置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
注意使用括号来限制sw
和json
的范围,这样std.Position
可以在他们出去后重新设置范围。 jsonToStream(rows)
现在将返回一个打开的 MemoryStream
,其中包含完整的序列化 JSON 并位于开头。
sample 加工 f# fiddle .
关于json - 如何序列化以在 F# 上使用 JSON.NET 进行流式传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48119433/