准备工作:

1、添加引用System.Web.Extensions,

2、.net3.5+版本都有,如果VS2010找不到,在这个文件夹找:C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\

3、再using System.Web.Script.Serialization;

4、using Newtonsoft.Json,下载Newtonsoft.Json

解析Json,一般方法:反序列化(次要)

        var js = new System.Web.Script.Serialization.JavaScriptSerializer();
string json = "{\"offlineLock\":[{\"id\":\"4028d808581dab0f01581db51405001e\",\"mac\":\"D4:3D:7E:5F:B7:44\",\"sdsl\":5,\"sdrq\":1477967156304,\"shlb\":\"0\"}],\"flag\":\"success\",\"status\":\"1400\",\"resultList\":[{\"id\":\"4028d808581dab0f01581db5145c001f\",\"zwjyzsbh\":\"1000001600000052\",\"sfyfz\":\"0\"},{\"id\":\"4028d808581dab0f01581db514780020\",\"zwjyzsbh\":\"1000001600000054\",\"sfyfz\":\"0\"},{\"id\":\"4028d808581dab0f01581db514950021\",\"zwjyzsbh\":\"1000001600000056\",\"sfyfz\":\"0\"},{\"id\":\"4028d808581dab0f01581db514b20022\",\"zwjyzsbh\":\"1000001600000058\",\"sfyfz\":\"0\"},{\"id\":\"4028d808581dab0f01581db514cc0023\",\"zwjyzsbh\":\"1000001600000060\",\"sfyfz\":\"0\"}]}";
var jarr = js.Deserialize<Dictionary<string, object>>(json);
foreach(var j in jarr)
{
Console.WriteLine(string.Format("{0}:{1}", j.Key, j.Value)); }
Console.ReadLine();

通过下标循环Dictionary的键值集合(次要)


for (int i = 0; i < jarr.Count; i++)
{
var item = jarr.ElementAt(i);//获取字典的下标为i的<key,value>值
var itemKey = item.Key;  //获取上面得到的key值
var itemValue = item.Value;//获取上面得到的value值
  }
 

实例:(主要)

KeyValuePair来遍历Dictionary

        var js = new System.Web.Script.Serialization.JavaScriptSerializer();
string json = "{\"offlineLock\":[{\"id\":\"4028d808581dab0f01581db51405001e\",\"mac\":\"D4:3D:7E:5F:B7:44\",\"sdsl\":5,\"sdrq\":1477967156304,\"shlb\":\"0\"}],\"flag\":\"success\",\"status\":\"1400\",\"resultList\":[{\"id\":\"4028d808581dab0f01581db5145c001f\",\"zwjyzsbh\":\"1000001600000052\",\"sfyfz\":\"0\"},{\"id\":\"4028d808581dab0f01581db514780020\",\"zwjyzsbh\":\"1000001600000054\",\"sfyfz\":\"0\"},{\"id\":\"4028d808581dab0f01581db514950021\",\"zwjyzsbh\":\"1000001600000056\",\"sfyfz\":\"0\"},{\"id\":\"4028d808581dab0f01581db514b20022\",\"zwjyzsbh\":\"1000001600000058\",\"sfyfz\":\"0\"},{\"id\":\"4028d808581dab0f01581db514cc0023\",\"zwjyzsbh\":\"1000001600000060\",\"sfyfz\":\"0\"}]}";
Dictionary<string, object> jarr = js.Deserialize<Dictionary<string, object>>(json);
string OfflineLock_id = "";
foreach (KeyValuePair<string, object> j in jarr)
{ //string OfflineLock_id = "";
string ZwjyzsList_id = "";
string ZwjyzsList_sfyfz = "";
string ZwjyzsList_zwjyzsbh = ""; if (j.Key.Equals("offlineLock"))
{
string json2 = JsonConvert.SerializeObject(j.Value);
List<OfflineLock> list = JsonConvert.DeserializeObject<List<OfflineLock>>(json2);
foreach (OfflineLock ol in list)
{
Console.WriteLine(ol.id);
OfflineLock_id = ol.id;
Console.WriteLine(ol.mac);
}
}
if (j.Key.Equals("resultList"))
{
string pid = OfflineLock_id;
string json2 = JsonConvert.SerializeObject(j.Value);
List<ZwjyzsList> list = JsonConvert.DeserializeObject<List<ZwjyzsList>>(json2);
foreach (ZwjyzsList zl in list)
{
//Console.WriteLine(zl.zwjyzsbh);
ZwjyzsList_id = zl.id;
ZwjyzsList_sfyfz = zl.sfyfz;
ZwjyzsList_zwjyzsbh = zl.zwjyzsbh;
string sql = @" insert into jy_offline_lock_zslb(id,pid,zwjyzsbh,sfyfz)
values(@id,@pid,@zwjyzsbh,@sfyfz) "; DBDao.ExecuteSql(sql, new SQLiteParameter("@id", ZwjyzsList_id), new SQLiteParameter("@pid", pid)
, new SQLiteParameter("@zwjyzsbh", ZwjyzsList_zwjyzsbh), new SQLiteParameter("@sfyfz", ZwjyzsList_sfyfz)); } } }
Console.ReadLine();

实体类:

1、整个Json看成4个<key,value>,offlineLock 这个key的value有多条记录,用List保存

class Lock
{
public List<OfflineLock> offlineLock { get; set; }
public string flag { get; set; }
public string status { get; set; }
public List<ZwjyzsList> resultList { get; set; } }

2、

class OfflineLock
{
public string id { get; set; }
public string mac { get; set; }
public long sdsl { get; set; }
public long sdrq { get; set; }
public string shlb { get; set; }
}

3、

class ZwjyzsList
{
public string id { get; set; }
public string sfyfz { get; set; }
public string zwjyzsbh { get; set; }
}

4、DBDao.cs

public static int ExecuteSql(string sql, params SQLiteParameter[] parameters)
{ using (SQLiteConnection con = new SQLiteConnection(DATA_SOURCE))
{
con.Open();
using (SQLiteCommand cmd = new SQLiteCommand())
{
cmd.Connection = con;
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteNonQuery(); }
} }

解析:

(1)当用下面Dictionary反序列化解析这个Json数据时,保存为4个<key,value>

Dictionary<string, object> jarr = js.Deserialize<Dictionary<string, object>>(json);

(2)其中offlineLock 这个大<key,value>对的value又是几个小<key,value>对,

如果要取到小<key,value>的值,需要对offlineLock 这条记录重新<序列化-再反序列化>

string json2 = JsonConvert.SerializeObject(j.Value);
List<OfflineLock> list = JsonConvert.DeserializeObject<List<OfflineLock>>(json2);

C#解析复杂的Json成Dictionary<key,value>并保存到数据库(多方法解析Json 四)的更多相关文章

  1. c#字典怎么获取第一个键值 List<对象>获取重复项,转成Dictionary<key,List<对象>>

    c#字典怎么获取第一个键值 Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictio ...

  2. 用原始方法解析复杂字符串,json一定要用JsonMapper么?

    经常采集数据,肯定会碰到解析字符串,包括整个页面的html,或者json以及一些不标准的json格式... 以前用json序列化,有时候需要实体类,有的时候没有,比较麻烦,听说可以用JsonMappe ...

  3. 构造json参数时key的引号和js string转json的三种方式

    {name:"dd",age:"16"} {"name":"dd","age":"16&q ...

  4. Java创建和解析Json数据方法——org.json包的使用(转)

    org.json包的使用 1.简介   工具包org.json.jar,是一个轻量级的,JAVA下的json构造和解析工具包,它还包含JSON与XML, HTTP headers, Cookies, ...

  5. Javascript调用C#后台方法及JSon解析

    Javascript调用C#后台方法及JSon解析   如何使用Ajax 调用C# 后台方法. 本文目录 如何使用Ajax 调用C# 后台方法. 1.后台(.cs)测试方法 2.前台调用(javasc ...

  6. 【python】json中字典key不可为数值型

    遇到了一个很诡异的错误.写一个字典,存入json文件.之后读出判断是否存在key.结果惊奇的发现,同一个key居然存在两次. 原因:json会将数值key转换为unicode 结论:使用json时字典 ...

  7. JSON.parse() 方法解析一个JSON字符串

    JSON.parse() 方法解析一个JSON字符串,构造由字符串描述的JavaScript值或对象.可以提供可选的reviver函数以在返回之前对所得到的对象执行变换. 语法EDIT JSON.pa ...

  8. 将Object转换成Dictionary方法

    如果Object是Dictionary类型,直接返回 如果Object是NameValueCollection类型,则添加到Dictionary里 如果Object是Hashtable类型,添加到Di ...

  9. com.alibaba.fastjson和org.json遍历获取key

    推荐都是用fastjson.org.json好像不支持序列化. com.alibaba.fastjson遍历获取key的方法: //fastjson解析方法 for (Map.Entry<Str ...

随机推荐

  1. php flush()刷新不能输出缓冲的原因分析

    在php程序编写中,flush()的使用率还是挺高的,它在网页表现即时信息效果时发挥了极为重要的作用,比如之前写的php实现限制文件下载速度的代码实例,flush()就起了举足轻重的作用,是进度条实现 ...

  2. js实现checkbox的全选和全不选功能

    html代码: <form name="form1" method="post" action="manage.php?act=sub" ...

  3. css编码规范

    css编码规范 https://segmentfault.com/a/1190000002460968 常用样式测试工具 W3C CSS validator:http://jigsaw.w3.org/ ...

  4. SSH命令行上传/下载文件

    上传:scp /path/file(这部分为本地的路径) user(远端目标用户名)@host(远端目标IP):/pathorfile(文件存储路径) 下载:scp user(远端用户名)@host( ...

  5. android中的通信机制总结

      第一种:使用handler来进行通信   handler 大家可以把它想象成主线程(UI线程)的一个子线程,它可以给主线程(UI线程)发送数据从而更新主线程(UI线程)的UI与逻辑,handler ...

  6. Windows代码页、区域

    目录 第1章代码页    1 1 代码页    1 1.1 单字节字符集    1 1.2 双字节字符集    1 1.3 多字节字符集    1 1.4 ANSI代码页    2 2 枚举代码页   ...

  7. webstorm注释写出的提示

    写出这种代码提示的方法是 在一个函数上方打出 /** 然后敲回车就出出来 没达到上面的效果,自己手动写上即可. 这样的好处是: 当你写代码用到此方法的时候会有参数类型提示,如图

  8. robot API笔记6

    robot.libraries 计划举办机器人框架标准测试库. 图书馆是主要用于外部的测试数据,但是他们可以 也使用自定义测试库是否有必要. 特别是 的内装式 图书馆通常是有用的 当需要与框架. 因为 ...

  9. [redis] Redis 配置文件置参数详解

    ################################ 基础配置 ################################# #daemonize no 默认情况下, redis 不 ...

  10. C/C++ 如何劫持别人家的命令||函数||程序(只能对于window而言)

    要实现下面程序,首先我们需要三个文件 detours.h ,detours.lib ,detver.h(可以去网上下载) 1. 首先让我们看看,一个最简单的C程序,如何劫持system函数. #inc ...