当使用System.Web.Helpers中的Json类并运行以下代码时,我希望它生成一个包含与原始字符串相同信息的json字符串,但奇怪的是它只返回字符串{ "employees" : {} }并完全省略该数组并替换它用空物体?
string jsonData = "{ \"employees\": [ { \"firstName\":\"John\" , \"lastName\":\"Doe\" }, { \"firstName\":\"Anna\" , \"lastName\":\"Smith\" }, { \"firstName\":\"Peter\" , \"lastName\":\"Jones\" } ] }";
var json = Json.Decode(jsonData);
string result = Json.Encode(json);
// result is: { "employees" : {} }
Run Code Online (Sandbox Code Playgroud)
当我查看从Json.Decode返回的对象时,数组被解码为DynamicJsonArray.如果我使用数组/列表/字典创建一个.NET对象,它似乎完美地编码它们,所以问题似乎与DynamicJsonArray有关.
如果我编码/解码没有数组的复杂json字符串,它似乎工作正常:
string jsonData = "{ \"firstName\": \"John\", \"lastName\": \"Doe\", \"family\": { \"mother\": { \"firstName\": \"Anna\", \"lastName\": \"Smith\" }, \"father\": { \"firstName\": \"Peter\", \"lastName\": \"Jones\" } } }";
var json = Json.Decode(jsonData);
string result …Run Code Online (Sandbox Code Playgroud) 我对反应式扩展相当陌生,想要根据时间缓冲流,或者根据不超过阈值的运行总和(每个项目的大小由 lambda 指定)以先发生者为准,就像按计数或时间现有的Buffer那样。
目前,我已经编写了自己的方法实现Buffer,该方法按预期工作,使用ISchedulerfor 触发超时,然后管理内存中自己的缓冲区,并在累积总和超过阈值时发出它们,但这感觉有点低水平,我认为必须有一个更优雅的解决方案来以某种方式使用现有的反应式操作来表达它,并且可能使用重载TBufferClosing来Buffer代替。
到目前为止,我想出的最佳解决方案如下,但它的缺点是包含最后一项,导致阈值导致总和大于请求的最大总和:
public static IObservable<IList<TSource>> Buffer<TSource>(this IObservable<TSource> source, Func<TSource, int> sizeSelector, int maxSize, TimeSpan bufferTimeSpan)
{
var shared = source.Publish().RefCount();
return shared.Buffer(() => Observable.Amb(
Observable.Timer(timeSpan)
.Select(_ => Unit.Default),
shared.Select(sizeSelector)
.Scan((a, b) => a + b)
.SkipWhile(accumulated => accumulated < maxSize)
.Select(_ => Unit.Default))
);
}
Run Code Online (Sandbox Code Playgroud)
这是否可以与现有的操作员一起工作(通过调整我的上述版本或完全以其他方式),或者我是否被迫继续使用我的自定义Buffer 实现处理计时器并自己缓冲?