Couchbase — десериализовать json в динамический тип

Я пытаюсь десериализовать некоторый JSON, возвращающийся с дивана, в динамический тип. Документ выглядит примерно так, поэтому создание POCO для него было бы излишним:

{
    UsersOnline: 1
}

Я подумал, что что-то вроде этого поможет, но, похоже, он десериализуется в динамический объект со значением, просто являющимся исходным JSON.

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

приводит к:

jsonObj { "online": 0 }

Могу ли я в любом случае заставить десериализатор кушетки сгенерировать для меня динамический тип?

Ваше здоровье


person managedheap84    schedule 28.01.2013    source источник


Ответы (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

person John Zablocki    schedule 28.01.2013
comment
Привет, Джон, спасибо за ответ - откуда берется переменная item в приведенных выше примерах? Также как записи преобразуются в словари? Сейчас утро, поэтому мне может понадобиться мой кофе, прежде чем я смогу это понять, ура - person managedheap84; 29.01.2013
comment
Ой! Я забыл скопировать и вставить самые важные строки - собственно Get. Извини за это. Я обновил код, чтобы включить назначение элемента. - person John Zablocki; 29.01.2013
comment
ExpandoObject был именно тем, что я искал — в итоге я создал 5-строчный POCO в файле .cs, но это несколько хороших альтернатив, ура! - person managedheap84; 29.01.2013
comment
Рад, что это сработало для вас, и я наконец нашел хороший вариант использования ExpandoObject. :) - person John Zablocki; 29.01.2013
comment
Вау, только что увидел ваш блог и методы расширения - круто :-) - person managedheap84; 06.02.2013