在Web Api项目中阅读CollectionJson内容

时间:2014-08-27 16:52:51

标签: c# json asp.net-web-api asp.net-web-api2 collection-json

我有一个与Conference API project类似的项目(几乎完全相同),它采用与返回CollectionJson内容的着名项目类似的方法。我很难设置ReadDocument的Collection属性(第30行),因为它没有任何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的内容?

要清楚了解方法,请查看Conference Web Apiauthors blog

3 个答案:

答案 0 :(得分:1)

好的,这已经修好了。 Collection属性现在可以再次设置。

我刚推送了release 0.7.0这个修复,一个主要的命名重构,以及对序列化的一个很好的改进,不写出空集合。

请参阅release notes了解更改(特别是命名,因为包名称和命名空间已更改)

答案 1 :(得分:0)

就我从代码中看到的那样,你没有序列化ReadDocument对象,而只是序列化它的一个属性(Collection),然后你尝试将该值反序列化为一个新的{ {1}}对象。

示例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个对象空ReadDocument

如果您愿意在单元测试中使用Collection

答案 2 :(得分:0)

我正在研究这个问题,并将在本周末提出一个有希望的解决方案,这将成为一个公共的制定者,或者让内部的制定者和接受集合的公共ctor。

抱歉有困难。