我正在尝试将从couchbase返回的一些JSON反序列化为动态类型。 该文件是这样的,所以为此创建一个POCO将是过度的:
{
UsersOnline: 1
}
我认为像这样的东西可以解决问题,但它似乎反序列化为动态对象,其值只是原始的JSON
var jsonObj = _client.GetJson<dynamic>(storageKey);
结果:
jsonObj { "online": 0 }
无论如何我可以让couchbase解串器为我生成动态类型吗?
干杯
答案 0 :(得分:1)
客户端的默认反序列化器使用.NET的二进制序列化器,因此当您保存或读取JSON字符串时,它只是一个字符串。 GetJson将始终只返回一个字符串。但是,有几个选择:
您可以将JSON记录转换为字典实例:
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
上发表了关于它们的博客