/// <summary>
/// 将json字符串自动转成dataset,并且自动补全主子关联关系,
/// Guid,FKGuid
/// Author:lijia
/// date:2019-03-28
/// </summary>
/// <param name="schemaName"></param>
/// <param name="tbName">datatable名称</param>
/// <param name="jsonDS">dataset对象</param>
/// <param name="dsJs">json字符串</param>
/// <param name="ListToStringColumn">需要做特殊处理的字段,如字段a:["1","2"]不希望生成单独表</param>
public static void GetDsFromJson(string schemaName, string tbName, DataSet jsonDS, JObject dsJs, List<string> ListToStringColumn)
{
CreateTbByJson(tbName, jsonDS, dsJs, ListToStringColumn);
CreateTbDbByJson(tbName, "rtnTb", "", jsonDS, dsJs, ListToStringColumn);
if (!string.IsNullOrEmpty(schemaName))
{
foreach (DataTable item in jsonDS.Tables)
{
item.TableName = schemaName + "_" + item.TableName;
}
}
}

/// <summary>
/// 根据json组装dataset
/// </summary>
/// <param name="tbName">datatable名称</param>
/// <param name="jsonDS">dataset对象</param>
/// <param name="tbJs">json字符串</param>
/// <param name="ListToStringColumn">需要做特殊处理的字段,如字段a:["1","2"]不希望生成单独表</param>
private static void CreateTbByJson(string tbName, DataSet jsonDS, JObject tbJs, List<string> ListToStringColumn)
{
if (tbName == "") tbName = "rtnTb";
DataTable tb = new DataTable();
tb.TableName = tbName;
if (ListToStringColumn == null)
{
ListToStringColumn = new List<string>();
}
//循环json字符串组装表结构
foreach (var item in tbJs)
{
string fdname = item.Key;
if (ListToStringColumn.Contains(fdname))
{
if (!tb.Columns.Contains(fdname))
{
DataColumn dc = new DataColumn(fdname, typeof(string));
tb.Columns.Add(dc);
}
}
else
{
if (item.Value.Type != JTokenType.Array && item.Value.Type != JTokenType.Object)
{
if (!tb.Columns.Contains(fdname))
{
DataColumn dc = new DataColumn(fdname, typeof(string));
tb.Columns.Add(dc);
}
}
else
{
if (item.Value.Type == JTokenType.Array)
{
JArray rowsJA = item.Value as JArray;
//判断,如果rowsJA第一个元素不是OBJECT,则表示此数组为枚举值数组,则增加表,字段为F1
if (rowsJA.Count > 0 && rowsJA[0].Type != JTokenType.Object && rowsJA[0].Type != JTokenType.Array)
{
if (ListToStringColumn.Count <= 0 || (ListToStringColumn.Count > 0 && !ListToStringColumn.Contains(item.Key)))
{
JArray tmpRowsJA = new JArray();
for (int i = 0; i < rowsJA.Count; i++)
{
JObject tmpRowJO = new JObject();
tmpRowJO.Add("F1", rowsJA[i]);
tmpRowsJA.Add(tmpRowJO);
}
JObject jo = new JObject();
jo.Add(item.Key, tmpRowsJA);
CreateTbByJson(item.Key, jsonDS, jo, ListToStringColumn);
}
}
else
{
foreach (var ArrayItem in item.Value)
{

CreateTbByJson(item.Key, jsonDS, (JObject)ArrayItem, ListToStringColumn);
}
}
}
else
{
CreateTbByJson(item.Key, jsonDS, (JObject)item.Value, ListToStringColumn);
}
}
}
}
if (!tb.Columns.Contains("Guid"))
{
DataColumn dc = new DataColumn("Guid", typeof(string));
tb.Columns.Add(dc);
}
if (!tb.Columns.Contains("Fk_Guid"))
{
DataColumn dc = new DataColumn("Fk_Guid", typeof(string));
tb.Columns.Add(dc);
}
if (!string.IsNullOrEmpty(tbName) && !jsonDS.Tables.Contains(tbName)) //准备表结构
{
jsonDS.Tables.Add(tb);
}
}

/// <summary>
/// 把json数据转换成dataset
/// </summary>
/// <param name="tbName">datatable名称</param>
/// <param name="mtbName">主表名称</param>
/// <param name="strFGuid">Guid唯一键</param>
/// <param name="jsonDS">已经通过json组装好的dataset</param>
/// <param name="tbJs">json数据</param>
/// <param name="ListToStringColumn">需要做特殊处理的字段,如字段a:["1","2"]不希望生成单独表</param>
public static void CreateTbDbByJson(string tbName, string mtbName, string strFGuid, DataSet jsonDS, JObject tbJs, List<string> ListToStringColumn)
{
if (tbName == "") tbName = "rtnTb";
if (jsonDS.Tables.Contains(tbName))
{
DataRow dr = jsonDS.Tables[tbName].NewRow();
string strGuid = System.Guid.NewGuid().ToString();
//strFGuid = strFGuid + "+" + mtbName;
dr["Guid"] = strGuid;
dr["Fk_Guid"] = strFGuid;
foreach (var item in tbJs)
{
string fdname = item.Key;
if (ListToStringColumn.Contains(fdname))
{
dr[fdname] = item.Value.ToString().Replace("[", "").Replace("]", "").Replace(" ", "").Replace("\"", "");
}
else
{
if (item.Value.Type != JTokenType.Array && item.Value.Type != JTokenType.Object)
{
if (!jsonDS.Tables[tbName].Columns.Contains(fdname))
{
DataColumn dc = new DataColumn(fdname, typeof(string));
jsonDS.Tables[tbName].Columns.Add(dc);
}
dr[fdname] = item.Value;
}
else
{
if (item.Value.Type == JTokenType.Array)
{
JArray rowsJA = item.Value as JArray;
//判断,如果rowsJA第一个元素不是OBJECT,则表示此数组为枚举值数组,则增加表,字段为F1
if (rowsJA.Count > 0 && rowsJA[0].Type != JTokenType.Object && rowsJA[0].Type != JTokenType.Array)
{
if (ListToStringColumn.Count <= 0 || (ListToStringColumn.Count > 0 && !ListToStringColumn.Contains(item.Key)))
{
JArray tmpRowsJA = new JArray();
for (int i = 0; i < rowsJA.Count; i++)
{
JObject tmpRowJO = new JObject();
tmpRowJO.Add("F1", rowsJA[i]);
tmpRowsJA.Add(tmpRowJO);
}
rowsJA = tmpRowsJA;
}
}
foreach (var ArrayItem in rowsJA)
{
CreateTbDbByJson(item.Key, tbName, strGuid, jsonDS, (JObject)ArrayItem, ListToStringColumn);
}
}
else
{
CreateTbDbByJson(item.Key, tbName, strGuid, jsonDS, (JObject)item.Value, ListToStringColumn);
}
}
}

}
if (null != dr)
{
jsonDS.Tables[tbName].Rows.Add(dr);
}
}
}

json转dataset的另外一种解析方式自动生成guid强关联的更多相关文章

  1. JSON的三种解析方式

    一.什么是JSON? JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定 ...

  2. xml中俩种解析方式

    两种解析方式 1.from xml.etree import ElementTree as ET 利用ElementTree模块下的xml方法可以把一个字符串类型的东西转换成Element类,从而利用 ...

  3. Android平台中实现对XML的三种解析方式

    本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...

  4. xml常用四种解析方式优缺点的分析×××××

    xml常用四种解析方式优缺点的分析 博客分类: xml   最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下. 首先介绍一下xml语 ...

  5. XML 的4种解析方式

    在上一篇博客中,我们介绍了什么是 XML ,http://www.cnblogs.com/ysocean/p/6901008.html,那么这一篇博客我们介绍如何来解析 XML . 部分文档引用:ht ...

  6. 【代码笔记】iOS-json文件的两种解析方式

    一,工程图. 二,代码. #import "ViewController.h" #import "SBJson.h" @interface ViewContro ...

  7. XML解析——Java中XML的四种解析方式

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...

  8. XML的两种解析方式

    JDK提供的XML解析方式分为两种:DOM方式和SAX方式DOM:Document Object Model.需要读取整个XML文档,先需要在内存中构架代表整个DOM树的Document对象,可以进行 ...

  9. XML解析——Java中XML的四种解析方式(转载 by 龍清扬)

    XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四 ...

随机推荐

  1. 自动化运维工具:ansible

    自动化运维工具:ansible Ansible(1):简介和基本概念 Ansible(2):安装配置 Ansible(3):ansible资源清单管理 Ansible(4):常用模块

  2. C语言结构体定义位域,从bit0开始,依次到最高bit位

    位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据 ...

  3. Ubuntu Xftp 配置

    sudo apt-get updatesudo apt install openssh-serversudo apt-get install vsftpdsudo service vsftpd res ...

  4. Vue 路由&组件懒加载(按需加载)

    当打包构建应用时,Javascript 包会变得非常大,影响页面加载速度.使用Vue路由懒加载和组件懒加载可以提升页面加载速度,减少白屏时间,提升用户体验. 用法有如下三种:(路由懒加载与组件懒加载用 ...

  5. 来去学习之---KMP算法--next计算过程

    一.概述 KMP算法是一种字符串匹配算法,比如现有字符串 T:ABCDABCDABCDCABCDABCDE, P:ABCDABCDE P字符串对应的next值:[0,0,0,0,1,2,3,4,0] ...

  6. UI自动化技术在高德的实践

    一.背景汽车导航作为ToB业务,需要满足不同汽车厂商在功能和风格上体现各自特色的需求.针对这种情况,传统的UI开发方式,基本上是一对一的特别定制.但是这种方式动辄就要500~600人日的工作量投入,成 ...

  7. Webdriver启动Firefox浏览器后,页面显示空白

    在使用pycharm码代码时编译总是出错,后来验证发现浏览器启动后出现问题.白白耗了我2个小时.我把我的解决方案写出来,希望对大家有帮助. 1.现象:起初安装的时候总是能正常运行,有一天突然发现Web ...

  8. CentOS7 GlusterFS文件系统部署

    一.GlusterFS简介 GlusterFS(GNU ClusterFile System)是一种全对称的开源分布式文件系统,所谓全对称是指GlusterFS采用弹性哈希算法,没有中心节点,所有节点 ...

  9. c# 关于抓取网页源码后中文显示乱码的原因分析和解决方法

    原因分析:首先,目前大多数网站为了提升网页浏览传输速率都会对网站内容在传输前进行压缩,最常用的是GZIP压缩解压解压算法,也是支持最广的一种. 因为网站传输时采用的是GZIP压缩传输,如果我们接受we ...

  10. Html介绍,了解html代码的注释

    什么是代码注释?在代码编辑器中的注释代码是不会在浏览器窗口展示的!html代码注释的作用是帮助程序员标注代码的用途,过一段时间后再看你之前编写的代码,很快可以想起这个代码的用途.代码注释不仅方便程序员 ...