Couchbase - 将json反序列化为动态类型

时间:2013-01-28 18:02:58

标签: json deserialization couchbase

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

{
    UsersOnline: 1
}

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

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

结果:

jsonObj { "online": 0 }

无论如何我可以让couchbase解串器为我生成动态类型吗?

干杯

1 个答案:

答案 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

上发表了关于它们的博客