策划填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带斜杠的问题(其一)的更多相关文章

  1. 【C#】读取Excel中嵌套的Json对象,Json带斜杠的问题(其三)

    除了上一篇中提到的对字符串的字符替换操作,去掉Json中的转义符反斜杠\之外,还发现了更加简单的办法. 就是使用Newtownsoft.Json序列化Json时,将嵌套的Json对象(字符串)转为JO ...

  2. 【C#】读取Excel中嵌套的Json对象,Json带斜杠的问题(其二)

    上一篇说到的嵌套Json带有斜杠的问题,如下图: 上一篇中用反射C#类的方法,在序列化Json阶段实现了去掉斜杠,现在还有一种相对更简单的方法,就是在反序列化阶段,读取Json时通过字符串的操作,把这 ...

  3. java的poi技术下载Excel模板上传Excel读取Excel中内容(SSM框架)

    使用到的jar包 JSP: client.jsp <%@ page language="java" contentType="text/html; charset= ...

  4. python读取excel中单元格的内容返回的5种类型

    (1) 读取单个sheetname的内容. 此部分转自:https://www.cnblogs.com/xxiong1031/p/7069006.html python读取excel中单元格的内容返回 ...

  5. C# 读取Excel中的数据

    #region 读取Excel中的数据 /// <summary> /// 读取Excel中的数据 /// </summary> /// <param name=&quo ...

  6. Open Xml 读取Excel中的图片

      在我的一个项目中,需要分析客户提供的Excel, 读出其中的图片信息(显示在Excel的第几行,第几列,以及图片本身). 网络上有许多使用Open Xml插入图片到Word,Excel的文章, 但 ...

  7. sql 读取excel中的数据

    select 列名 as 字段名 from openBowSet('MSDASQL.1','driver=Microsoft Excel Driver(*.xls);dbq=文件存放地址','sele ...

  8. PHP读取excel中地址实现多文件下载

    PHP文件下载有单文件和多文件之分,如果是单文件写个方法可以实现,但是如果想循环下载多个文件我试验是没有成功.先说单文件的下载,方法如下: function downfile($fileurl) { ...

  9. Python读取excel中的图片

    作为Java程序员,Java自然是最主要的编程语言.但是Java适合完成大型项目,对于平时工作中小的工作任务,需要快速完成,易于修改和调试,使用Java显得很繁琐,需要进行类的设计,打成jar包,出现 ...

随机推荐

  1. [Win] Win8权限机制导致R安装包失败

    在Rstudio安装tidyselect的时候,提示 ERROR: compilation failed for package ‘tidyselect’ 搜了一下,在github上找到tidysel ...

  2. 第一章 C++ primer Plus

    第一章 1.4程序创建的技巧 大体如下: 1.使用文本编辑器编写程序,并将其保存到文件中,这个文件就是程序的源代码. 2.编译源代码.这意味着运行一个程序,将源代码翻译为主机使用的内部语言——机器语言 ...

  3. 小型资源管理器之动态添加TreeView节点

    FrmMain主界面 using System; using System.Collections.Generic; using System.ComponentModel; using System ...

  4. 用STM32CudeMX 点亮红色LED灯(软件操作步骤为主)

    1.收获如何使用软件STM32CudeMX配置代码 注意:自己要敲的代码,直接看102行,其他是软件配置的.!!! /** ************************************** ...

  5. [JOISC2014]電圧

    [JOISC2014]電圧 题目大意: 一个\(n(n\le10^5)\)个点,\(m(m\le2\times10^5)\)条边的无向图.要在图中找到一条边,满足去掉这条边后,剩下的图是一个二分图,且 ...

  6. 浅析webpack使用方法

    webpack是一个网页模块打包工具,可以将所有代码.图片.样式打包在一起,除此之外还有许多实用的功能.最近看了一个慕课学习了一下webpack的使用,在这里做一下总结. 本文不会涉及太多深入的知识, ...

  7. BZOJ4267 : 小强的颜色

    首先剔除$1$号心情不能到达的无用心情,然后采用分割法进行DFA的最小化. 每次遍历所有集合,将集合中和集合中第一个心情行为或者转移所在集合不同的心情放入新集合中. 最后按字典序依次给每个集合编号即可 ...

  8. python系统编程(二)

    多次fork问题 如果在一个程序,有2次的fork函数调用,是否就会有3个进程呢? #coding=utf-8 import os import time # 注意,fork函数,只在Unix/Lin ...

  9. 深入理解JVM(6)——JVM性能调优实战

    如何在高性能服务器上进行JVM调优:以便充分利用高性能服务器的硬件资源,有两种JVM调优方案. 一.        采用64位操作系统,并为JVM分配大内存 分析:如果JVM中堆内存太小,那么就会频繁 ...

  10. 在Windows 操作系统中, MySql 如何设置, 允许表名支持大小写

    一般在网上会说明 修改my.ini文件的  lower_case_table_names = 0 参照: http://www.linuxidc.com/Linux/2013-04/82719.htm ...