0

我正在尝试将从 couchbase 返回的一些 JSON 反序列化为动态类型。该文档是这样的,因此为此创建一个 POCO 将是矫枉过正:

{
    UsersOnline: 1
}

我认为这样的事情可以解决问题,但它似乎反序列化为一个动态对象,其值只是原始 JSON

var jsonObj = _client.GetJson<dynamic>(storageKey);

结果是:

jsonObj { "online": 0 }

无论如何,我可以让 couchbase 反序列化器为我生成动态类型吗?

干杯

4

1 回答 1

1

客户端的默认反序列化程序使用 .NET 的二进制序列化程序,因此当您保存或读取 JSON 字符串时,它只是一个字符串。GetJson 将始终只返回一个字符串。但是,有几个选项:

您可以将 JSON 记录转换为 Dictionary 实例:

var appJson = "{ \"UsersOnline\" : 1, \"NewestMember\" : \"zblock\" }";
var result = client.ExecuteStore(StoreMode.Set, "userCount", appJson);
var item = client.GetJson<Dictionary<string, object>>("userCount");
Console.WriteLine("There are {0} users online.  The newest member is {1}.",
                    item["UsersOnline"], item["NewestMember"]);

或者您可以使用动态 ExpandoObject 实例:

var appJson = "{ \"UsersOnline\" : 1, \"NewestMember\" : \"zblock\" }";
var result = client.ExecuteStore(StoreMode.Set, "userCount", appJson);
dynamic item = client.GetJson<ExpandoObject>("userCount");
Console.WriteLine("There are {0} users online.  The newest member is {1}.",
                    item.UsersOnline, item.NewestMember);

在任何一种情况下,您都会丢失静态类型检查,这对于您的目的来说似乎没问题。在这两种情况下,您都可以访问 JSON 属性,而无需将 JSON 解析为 POCO...

编辑:我写了一些可能有用的扩展方法,并在http://blog.couchbase.com/moving-no-schema-stack-c-and-dynamic-types

于 2013-01-28T19:40:46.770 回答