我需要将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
响应以空字符串形式返回。
答案 0 :(得分:3)
您有以下问题:
您需要处置StreamWriter
和JsonTextWriter
,以便将序列化的JSON刷新到基础流。这可以通过将let
替换为use
来完成。
但是,您需要在不关闭基础流std
的情况下这样做,因为您稍后会阅读它。
完成此操作后,您需要在std
和sw
超出范围并被处置后重置json
信息流的位置。如果您在此之前尝试重置位置,那么它将无法正常工作。
因此以下内容将起作用:
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)
现在将返回一个包含完整序列化JSON的开放式MemoryStream
,并位于开头。
示例工作f# fiddle。