正在阅读WebApi项目中的CollectionJson内容
本文关键字:CollectionJson 内容 项目 WebApi | 更新日期: 2023-09-27 18:19:34
我有一个与Conference API项目类似(几乎相同)的项目,该项目采用与上述项目类似的方法返回CollectionJson内容。设置ReadDocument(第30行)的Collection属性时遇到困难,因为它没有任何setter。我可以通过做以下更改来绕过这个问题
public CollectionJsonContent(Collection collection)
{
var serializerSettings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
Formatting = Newtonsoft.Json.Formatting.Indented,
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
collection.Version = "1.0";
Headers.ContentType = new MediaTypeHeaderValue("application/vnd.collection+json");
using (var writer = new JsonTextWriter(new StreamWriter(_memoryStream)){CloseOutput = false})
{
//var readDocument = new ReadDocument(); {IReadDocument.Collection = collection};
var serializer = JsonSerializer.Create(serializerSettings);
serializer.Serialize(writer,collection);
writer.Flush();
}
_memoryStream.Position = 0;
}
尽管上面的代码编译并在一定程度上解决了问题,但我将再次遇到另一个问题,即无法在控制器单元测试中使用JsonCollection内容。考虑以下单元测试代码片段:
using (var request = CreateRequest())
{
var controller = new TestController(DataService) {Request = request};
var temp = await controller.ListAsync(gridSearchData, sampleSearchData);
if ((temp is NotFoundResult) && (sampleCollection.Any()))
{
Assert.Fail("Controller did not return any result but query did");
}
var json = await temp.ExecuteAsync(cancellationTokenSource);
var readDocument = json.Content.ReadAsAsync<ReadDocument>(new[] {new CollectionJsonFormatter()}, cancellationTokenSource).Result;
}
由于我没有设置ReadDocument的集合属性,ReadDocument始终为空,我无法读取其内容。在WEB API项目中,如何在客户端异步读取JsonCollection的内容?
要清楚地了解该方法,请查看会议Web Api作者的博客
好吧,这已经解决了。Collection属性现在可以再次设置。
我刚刚推出了带有此修复的0.7.0版本,这是一个主要的命名重构,也是对序列化的一个很好的改进,不会写出空集合。
有关更改(尤其是包名称和命名空间发生更改时的命名),请参阅发行说明
据我所知,从您的代码中,您不序列化ReadDocument
对象,而只序列化它的一个属性(Collection
),然后尝试将该值反序列化为新的ReadDocument
对象。
示例ReadDocument
应该像这样序列化
"{"Collection": [1,2,3,4,5] }"
但是你序列化集合,所以你得到
"[1,2,3,4,5]"
我推荐一个用于序列化的代理类,如
class SerializableReadDocument
{
public Collection Collection { get; set; }
}
并像这个一样更新您的序列化代码
using (var writer = new JsonTextWriter(new StreamWriter(_memoryStream)){CloseOutput = false})
{
var readDocument = new SerializableReadDocument() { Collection = collection };
var serializer = JsonSerializer.Create(serializerSettings);
serializer.Serialize(writer, readDocument);
writer.Flush();
}
但是,当您尝试反序列化输出时,这并不能解决您的问题,因为ReadDocument
没有可设置的Collection
属性,反序列化将失败,或者返回一个Collection
为空的ReadDocument
对象。
如果您愿意,可以在单元测试中使用SerializableReadDocument
。
我正在对此进行研究,并将在本周末提出一个有希望的解决方案,该解决方案要么使其成为公共setter,要么使setter成为内部的并具有接受集合的公共ctor。
很抱歉给你带来困难。