Как десериализовать с помощью JSON.Net анонимный тип?

Просто пытаюсь создать анонимный тип из JSON, ничего не зная заранее о параметрах, и полностью их интерпретируя (возможно, с подсказками). т.е. это значение «выглядит» как int, строка или дата.

Единственный способ, о котором я знаю до сих пор, - это создать анонимный тип, о котором вы заранее знаете. См. Метод .DeserializeAnonymousType (...) ниже.

Может ли кто-нибудь сделать лучше этого? Спасибо.

        var jsonString = "{\"user_id\": 1, \"user_type\": \"moderator\", \"name\": \"Fred\"}";

        JToken root = JObject.Parse(jsonString);

        var anonTemplate = new{user_id=0, user_type="", name="" };

        var a = JsonConvert.DeserializeAnonymousType(root.ToString(), anonTemplate);


        var b = JsonConvert.DeserializeObject<Object>(root.ToString());  // actually turns into a JsonObject which is something differet.

Обновить

Я скачал dynamicduck и немного поиграюсь с ним. Будет ли эта странная идея динамической «обертки» Брайана быть управляемой нужными мне способами (сериализуемая и т. Д.)?

http://weblogs.asp.net/britchie/archive/2010/08/05/json-net-dynamic-extensions.aspx

http://weblogs.asp.net/britchie/archive/2010/08/03/dynamicduck-duck-typing-in-a-dynamic-world.aspx


person sgtz    schedule 03.11.2011    source источник
comment
В случае .NET 4 я предполагаю, что вы сможете десериализовать объект dynamic, а затем явно получить доступ к требуемым свойствам.   -  person sll    schedule 03.11.2011
comment
Как вы собираетесь использовать этот объект, если не знаете, какие параметры он имеет или ожидает иметь?   -  person KallDrexx    schedule 03.11.2011
comment
@sll: есть пример? Не против динамических типов. Я их иногда использую. В этом случае мой следующий вопрос будет заключаться в том, как преобразовать динамический тип в анонимный. Я доволен любым путем, потому что производительность не является проблемой, однако мне действительно нужен анонимный тип в этом случае (существующие библиотеки).   -  person sgtz    schedule 03.11.2011
comment
@KallDrexx: есть и другие динамические DSL-штуки.   -  person sgtz    schedule 03.11.2011
comment
‹A href=drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/ статья ‹/a› описывает, как вернуть динамический C #, но не с Json.net   -  person KallDrexx    schedule 03.11.2011


Ответы (1)


Вы можете десериализовать с помощью JSON.NET в ExpandoObject с помощью ExpandoObjectConverter.

Чтобы создать анонимный тип во время выполнения, это немного сложнее, взгляните на обруч, пройденный в этом потоке:

Как создать дерево выражений LINQ для выбора анонимного тип

Как видите, довольно много усилий, которые, вероятно, не стоят того, поскольку вы все равно не получите никакой безопасности времени компиляции. Так что лучше всего вам подойдут dynamic или ExpandoObject.

person Paul Tyng    schedule 03.11.2011
comment
у вас есть пример использования ExpandoObjectConverter, на который вы могли бы ссылаться? - person sgtz; 09.11.2011