【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包,出现 ...
 
随机推荐
- .net3.5 支持tuple
			
添加下面引用即可: https://github.com/SaladLab/NetLegacySupport
 - JavaScript基础笔记(五) 函数表达式
			
函数表达式 一.闭包 概念:闭包是指有权访问另一个函数作用域中变量的函数. function createCompareFun(propertyName) { return function (obj ...
 - Kotlin基础(一)Kotlin快速入门
			
Kotlin快速入门 一.函数 /* * 1.函数可以定义在文件最外层,不需要把它放在类中 * 2.可以省略结尾分号 * */ fun main(args: Array<String>) ...
 - shell脚本6--循环,比较
			
for循环 for var in list; do commands;#使用变量$var done example: for i in {a..z}; do actions; done; 后者 for ...
 - yii2 配合bootstrap添加一个气泡
			
添加一个气泡 1.bootstrap 官网:http://getbootstrap.com/ 2.bootstrap 中文官网:http://v3.bootcss.com/ 添加气泡主要需要用到 bo ...
 - hiredis 使用 linux c++
			
1.linux下如何安装hiredis 1)下载地址 https://github.com/redis/hiredis 2)编译和安装 解压后的文件夹执行 make;make install; 3) ...
 - hnctf安恒--蜘蛛侠呀
			
这题不会做,赛场被吊打,事后才明白 首先解压看到是流量包,放在wireshark,过滤http很明显看到no_flag.zip,当时想这是个关键点,然后把时间都浪费在这上了,赛后发现并没有传输数据的包 ...
 - PMM 对MYSQL 的监控配制
			
系统选择: centos 7.2 关闭防火墙: systemctl stop firewalld.service systemctl disable firewalld.s ...
 - Android的Databinding-单向绑定
			
两种方式实现观察绑定. 一.POJO类实现android.databinding.Observable,在属性set方法中调用notifyPropertyChanged(BR.lastName); 其 ...
 - FileUpload1.PostedFile.FileName 获取的文件名
			
例如文件叫做 c:\web\a.jpg 如果用IE,则返回 c:\web\a.jpg 含路径 如果用Chrome,则返回 a.jpg 不含路径.