4

我有一个与Conference API项目类似(几乎相同)的项目,该项目采用与上述项目类似的方法来返回 CollectionJson 内容。我很难设置 ReadDocument 的 Collection 属性(第 30 行),因为它没有任何设置器。我可以通过进行以下更改来绕过这个问题

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 Api作者博客

4

3 回答 3

1

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

我刚刚发布了0.7.0 版本,其中包含此修复程序,这是一次重大的命名重构以及对序列化的一个很好的改进,不会写出空集合。

请参阅发行说明以了解更改(尤其是包名称和命名空间已更改的命名)

于 2014-09-10T09:05:49.327 回答
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属性,反序列化要么失败,要么返回ReadDocument一个空的对象Collection

SerializableReadDocument如果您愿意,可以在单元测试中使用。

于 2014-09-04T15:19:58.493 回答
0

我正在研究这个问题,并会在本周末提出一个有希望的解决方案,要么将其设为公共 setter,要么将 setter 设为内部并让公共 ctor 接受集合。

很抱歉的困难。

于 2014-09-06T17:16:59.030 回答