简体   繁体   中英

How to deserialize using JSON.Net to an anonymous type?

Just trying to create an anonymous type from JSON without knowing anything about the parameters ahead of time, and fully interpreting them (possibly with hints). ie that value "looks" like an int, string, or date.

The only way that I know of so far is to create an anonymous type that you have pre-knowledge of. See the .DeserializeAnonymousType(...) method below.

Can anyone do better than this? Thanks.

        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.

Update

I downloaded dynamicduck and am playing with it a little. Will this weird dynamic "wrapper" idea of Brian's be -able in the ways I need (serializable, etc)?

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

You can deserialize with JSON.NET to an ExpandoObject using the ExpandoObjectConverter .

To create an anonymous type at runtime, its quite a bit more complicated, take a look at the hoops jumped through in this thread:

How to create LINQ Expression Tree to select an anonymous type

As you can see quite a bit of effort that probably is not worth it as you still wouldn't get any compile time safety. So a dynamic or ExpandoObject are your best bets.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM