【C#】读取Excel中嵌套的Json对象,Json带斜杠的问题(其一)
策划填Excel表时,约定对于复杂类型的数据采用Json的格式填写。如下图,D列的内容是Json数据。

单元格中的Json如下。
{
"name": "BeJson2",
"url": "http://www.bejson.com",
"page": ,
"isNonProfit": true,
"address": {
"street": "科技园路.",
"city": "江苏苏州",
"country": "中国"
},
"links": [{
"name": "Google",
"url": "http://www.google.com"
}, {
"name": "Baidu",
"url": "http://www.baidu.com"
}, {
"name": "SoSo",
"url": "http://www.SoSo.com"
}]
}
择使用ExcelDataReader这个库读Excel时,对于单元格是Json字符串的情况,读取得到的Json会把这段嵌套的Json转为带斜杠(转义符)的字符串,类似下图的情况。

问题来了:这种字符串已经不再是Json格式了,用Newtonsoft.json库无法正确反序列化它。
办法:一种解决办法是在序列化Json时,就用一个C#类作为参照。通过反射C#类中对应属性的类型,来判断这个Json单元格对应的C#类(而不是string字符串)。
对于上面嵌套的Json,可以用C#类来描述如下。
public class User
{
public string id { get; set; }
public string name { get; set; }
public string attribute { get; set; }
public string ttr { get; set; } public UserConfig user_config { get; set; }
} public class UserConfig
{
public string Name { get; set; }
public string url { get; set; }
public int page { get; set; }
public bool isNonProfit { get; set; }
public Address address { get; set; }
public Links[] links { get; set; }
} public class Address
{
public string street { get; set; }
public string city { get; set; }
public string country { get; set; }
} public class Links
{
public string name { get; set; }
public string url { get; set; }
}
C#代码在序列化Json时,就判断每个单元格cell中的内容的类型,把嵌套的Json强转为对应C#的class类型,不能让它保持是string输出。
反射C#类并做判断的关键代码类似下面这样的:
// 存储一行Row数据。key是表头属性字段,value是单元格内容。
Dictionary<string, object> row = new Dictionary<string, object>(); Type fieldType = propertyInfo.PropertyType;
if (fieldType.IsPrimitive && fieldType.IsValueType)
{
int value = int.Parse(cell.ToString()); // 值类型,如int等数值(约定不用枚举)
row[field] = value;
}
else if (fieldType == typeof(string))
{
row[field] = cell.ToString(); // string
}
else if (fieldType.IsClass)
{
object obj = JsonConvert.DeserializeObject(cell.ToString()); // object
row[field] = obj;
}
这样导出的嵌套Json就不带斜杠了。因为它在输出时不在是string类型,而是object了。
缺点是序列化Json阶段就需要C#类(正常来说是反序列化时才需要的),反射C#造成的性能效率问题。
【C#】读取Excel中嵌套的Json对象,Json带斜杠的问题(其一)的更多相关文章
- 【C#】读取Excel中嵌套的Json对象,Json带斜杠的问题(其三)
除了上一篇中提到的对字符串的字符替换操作,去掉Json中的转义符反斜杠\之外,还发现了更加简单的办法. 就是使用Newtownsoft.Json序列化Json时,将嵌套的Json对象(字符串)转为JO ...
- 【C#】读取Excel中嵌套的Json对象,Json带斜杠的问题(其二)
上一篇说到的嵌套Json带有斜杠的问题,如下图: 上一篇中用反射C#类的方法,在序列化Json阶段实现了去掉斜杠,现在还有一种相对更简单的方法,就是在反序列化阶段,读取Json时通过字符串的操作,把这 ...
- java的poi技术下载Excel模板上传Excel读取Excel中内容(SSM框架)
使用到的jar包 JSP: client.jsp <%@ page language="java" contentType="text/html; charset= ...
- python读取excel中单元格的内容返回的5种类型
(1) 读取单个sheetname的内容. 此部分转自:https://www.cnblogs.com/xxiong1031/p/7069006.html python读取excel中单元格的内容返回 ...
- C# 读取Excel中的数据
#region 读取Excel中的数据 /// <summary> /// 读取Excel中的数据 /// </summary> /// <param name=&quo ...
- Open Xml 读取Excel中的图片
在我的一个项目中,需要分析客户提供的Excel, 读出其中的图片信息(显示在Excel的第几行,第几列,以及图片本身). 网络上有许多使用Open Xml插入图片到Word,Excel的文章, 但 ...
- sql 读取excel中的数据
select 列名 as 字段名 from openBowSet('MSDASQL.1','driver=Microsoft Excel Driver(*.xls);dbq=文件存放地址','sele ...
- PHP读取excel中地址实现多文件下载
PHP文件下载有单文件和多文件之分,如果是单文件写个方法可以实现,但是如果想循环下载多个文件我试验是没有成功.先说单文件的下载,方法如下: function downfile($fileurl) { ...
- Python读取excel中的图片
作为Java程序员,Java自然是最主要的编程语言.但是Java适合完成大型项目,对于平时工作中小的工作任务,需要快速完成,易于修改和调试,使用Java显得很繁琐,需要进行类的设计,打成jar包,出现 ...
随机推荐
- easyui中对数据的判断来显示,formatter控制
需求效果图:(把编辑按钮根据信息是否发布,来选择显示与不显示,已发布的不能够进行编辑所以不显示) 上图中的flag为发布标识,flag值1为已发布,值2为未发布 思路:第一想到的是给这个button按 ...
- [CC-BLREDSET]Black and Red vertices of Tree
[CC-BLREDSET]Black and Red vertices of Tree 题目大意: 有一棵\(n(\sum n\le10^6)\)个结点的树,每个结点有一种颜色(红色.黑色.白色).删 ...
- DAG 上的动态规划(训练指南—大白书)
有向无环图(DAG,Directed Acyclic Graph)上的动态规划是学习动态规划的基础.很多问题都可以转化为DAG上的最长路.最短路或路径计数问题. 一.矩形嵌套 题目描述: ...
- vector.erase用法注意事项
转自->这里 vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase(iterat ...
- python系统编程(四)
进程池Pool 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到mu ...
- pngcrush caught libpng error原因及解决方法
报错信息: While reading /Users/zhangyanfeng/Desktop/程序/KeyBoardDemo/KeyBoardDemo/keyboard/KerboardResour ...
- Java Web 域名
虽然可以直接通过IP地址来访问WWW的每一台主机,但是32位IP地址非常难记.所以,为了便于记忆,按照一定的规则给Internet上的计算机起了名字即域名.通俗地说,域名相当于一个房屋的门牌号码,别人 ...
- Java 构造器 考虑用静态构造方法代替构造器
类可以提供一个公有的静态工厂方法,它是一个返回类的实例的静态方法.静态工厂方法与设计模式中的工厂方法模式不同. 优势: 静态工厂方法与构造器不同的第一大优势在于,它们有名称.一个类只能有一个带有指定签 ...
- sqlserver数据类型转换
Insert into [Cet.4] Select CONVERT(VARCHAR(20),CONVERT(DECIMAL(20,7),F1)) FROM Sheet1$ 我从外部导入了一个学号表, ...
- JSAP102
JSAP102 1.API //案例:禁用文本框 <body> <input type="button" value="禁用" id=&quo ...