文档章节

使用Json.net将JSON对象反序列化为动态对象

 技术盛宴
发布于 02/03 15:53
字数 670
阅读 104
收藏 0

行业解决方案、产品招募中!想赚钱就来传!>>>

是否可以使用json.net从json反序列化返回动态对象? 我想做这样的事情:

dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);

#1楼

从Json.NET 4.0 Release 1开始,提供了本机动态支持:

[Test]
public void DynamicDeserialization()
{
    dynamic jsonResponse = JsonConvert.DeserializeObject("{\"message\":\"Hi\"}");
    jsonResponse.Works = true;
    Console.WriteLine(jsonResponse.message); // Hi
    Console.WriteLine(jsonResponse.Works); // True
    Console.WriteLine(JsonConvert.SerializeObject(jsonResponse)); // {"message":"Hi","Works":true}
    Assert.That(jsonResponse, Is.InstanceOf<dynamic>());
    Assert.That(jsonResponse, Is.TypeOf<JObject>());
}

而且,当然,获取当前版本的最佳方法是通过NuGet。

已于2014年11月12日更新以解决评论:

这工作得很好。 如果您在调试器中检查类型,则实际上该值是dynamic基础类型JObject 。 如果要控制类型(例如指定ExpandoObject ,则可以这样做)。

在此处输入图片说明


#2楼

是的,您可以使用JsonConvert.DeserializeObject做到这一点。 为此,只需执行以下操作:

dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);

#3楼

如果只是反序列化为动态,则将获得JObject。 您可以使用ExpandoObject获得所需的内容。

var converter = new ExpandoObjectConverter();    
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);

#4楼

如果您将JSON.NET与不是JObject的旧版本一起使用。

这是从JSON制作动态对象的另一种简单方法: https : //github.com/chsword/jdynamic

NuGet安装

PM> Install-Package JDynamic

支持使用字符串索引访问成员,例如:

dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);

测试用例

您可以按以下方式使用此实用程序:

直接获取价值

dynamic json = new JDynamic("1");

//json.Value

2,在json对象中获取成员

dynamic json = new JDynamic("{a:'abc'}");
//json.a is a string "abc"

dynamic json = new JDynamic("{a:3.1416}");
//json.a is 3.1416m

dynamic json = new JDynamic("{a:1}");
//json.a is integer: 1

3.IEnumerable

dynamic json = new JDynamic("[1,2,3]");
/json.Length/json.Count is 3
//And you can use json[0]/ json[2] to get the elements

dynamic json = new JDynamic("{a:[1,2,3]}");
//json.a.Length /json.a.Count is 3.
//And you can use  json.a[0]/ json.a[2] to get the elements

dynamic json = new JDynamic("[{b:1},{c:1}]");
//json.Length/json.Count is 2.
//And you can use the  json[0].b/json[1].c to get the num.

其他

dynamic json = new JDynamic("{a:{a:1} }");

//json.a.a is 1.

#5楼

注意:在2010年我回答这个问题时,没有某种类型就无法反序列化,这使您无需定义实际的类即可进行反序列化,并允许使用匿名类进行反序列化。


您需要某种反序列化的类型。 您可以按照以下方式进行操作:

var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());

我的答案基于.NET 4.0在JSON序列化器中构建的解决方案。 反序列化为匿名类型的链接在这里:

http://blogs.msdn.com/b/alexghi/archive/2008/12/22/using-anonymous-types-to-deserialize-json-data.aspx

粉丝 0
博文 2332
码字总数 0
作品 0
深圳
高级程序员
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
3.8K
3
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
5.8K
18
浅入浅出Android(003):使用TextView类构造文本控件

基础: TextView是无法供编辑的。 当我们新建一个项目MyTextView时候,默认的布局(/res/layout/activity_main.xml)中已经有了一个TextView: <TextView 运行效果如下: 修改其文本内容...

樂天
2014/03/22
576
1
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

spring集成kafka

1、引入依赖jar包 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId></dependency> 2、配置kafka信息 spring: kafka: bootstra......

简到珍
11分钟前
0
0
Spring Security 原理分析(一)

Spring Security 初始化 在普通的spring mvc 框架中,我们需要 @Configuration@EnableWebSecuritypublic class MyWebSecurityConfiguration extends WebSecurityConfigurerAdapter 手动添......

街角的小丑
19分钟前
6
0
查看 Linux 系统服务的 5 大方法

Linux 系统服务有时也称为守护程序,是在Linux启动时自动加载并在Linux退出时自动停止的系统任务。 在本文中,良许将为大家介绍如何列出 Linux 系统里所有运行的服务,以及如何检查某个服务的...

良许Linux
24分钟前
9
0
如何显示已上演的更改? - How do I show the changes which have been staged?

问题: I staged a few changes to be committed; 我上演了一些改变来承诺; how can I see the diff of all files which are staged for the next commit? 如何查看为下一次提交而暂存的所有...

技术盛宴
33分钟前
25
0
HashMap 的 defaultLoadFactor 的一种推导计算思路

1. 为啥需要 defaultLoadFactor 现在主流的 HashMap,一般的实现思路都是开放地址法+链地址法的方式来实现。 即数组 + 链表的实现方式,通过计算哈希值,找到数组对应的位置,如果已存在元素...

zhxhash
37分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部