我需要将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,并位于开头。
工作 f# 小提琴示例。