.NET Json 解析到Dictionary,原生代码
之前一直使用微软自带的Json,也一直想试着自己解析下Json玩玩,于是花了一个晚上的时间写了个解析的类,
先说下思路,先从简单的说起:如:标准的JSon格式如:{"Key":"Value1","Key2":1,"Key3":[1,2,3,4],"Key4":{"Test1":"2"},"Key5":[{"A":1,"B":2}]}
我是这样分的把{}的内容看成是一个完整的对象,遇到{}就把他当完整的对象解析(我表达能力可能有问题,不太会表达)
首先是读Key 严格的格式来说 Key必须带双引号,但不排除没带的 所以我做了下判断 如果有双引号 就去掉 ,然后都value值,Value值大致可分三种,
一种就是普通的值 如:字符串、数字、时间,
第二种是 完整的类 ,
第三种就是数组,但数组其实也可以分为两种,一种是普通数组,一种是带子类的数组,
测试了下性能 感觉还行,就发上来了

别吐槽哈 小弟也就这两下子
#region 声明
/********************************************************************************************
* CLR版本:4.0.30319.34011
* .NET版本:V4.0
* 类 名 称:SR
* 命名空间:DotNet
* 创建时间:2014/3/9 19:19:36
* 作 者:中国.NET研究协会 (网站:http://www.dotnet.org.cn QQ群:45132984)
* 识 别 号:b8f20131-829f-4db0-87a7-d62f8c5ab404
********************************************************************************************/
/*****************************************本版权权*******************************************
* 本软件遵照GPL协议开放源代码,您可以自由传播和修改,在遵照下面的约束条件的前提下:
* 一. 只要你在每一副本上明显和恰当地出版版权声明,保持此许可证的声明和没有
* 担保的声明完整无损,并和程序一起给每个其他的程序接受者一份许可证的副本,
* 你就可以用任何媒体复制和发布你收到的原始的程序的源代码。你也可以为转让
* 副本的实际行动收取一定费用,但必须事先得到的同意。
* 二. 你可以修改本软件的一个或几个副本或程序的任何部分,以此形成基于程序的作品。
* 只要你同时满足下面的所有条件,你就可以按前面第一款的要求复制和发布这一经
* 过修改的程序或作品。
* 三.只要你遵循一、二条款规定,您就可以自由使用并传播本源代码,
* 但必须原封不动地保留原作者信息。
**********************************************************************************************/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text; namespace DotNet.Json
{
public class JsonReader
{
private TextReader myReader;
private int EndCount = ;
Dictionary<string,object> myObjDate;
private JsonReader(TextReader reader, int endCount = )
{
myObjDate = myObjDate = new Dictionary<string, object>();
myReader = reader;
EndCount = endCount;
int intByte = ReadInt();
while (EndCount != && intByte != -)
{
var key = ReadKeyName(intByte);
var value = ReadValue();
myObjDate.Add(key, value);
if (EndCount == ) { break; }
intByte = ReadInt();
}
}
public JsonReader(TextReader reader)
: this(reader, )
{ }
public JsonReader(string value)
: this(new StringReader(value), )
{ }
private int ReadInt()
{
var intByte = myReader.Read();
if (intByte == )
{
EndCount++;
}
else if (intByte == )
{
EndCount--;
}
return intByte;
}
private string ReadKeyName(int lastChar)
{
StringBuilder strBuilder = new StringBuilder();
var intByte = lastChar;
if (intByte == )
{
intByte = myReader.Read();
}
var lastIntByte = -;
int endByteInt = -;
if (intByte == -)
{
return null;
}
if (intByte == || intByte == )
{
endByteInt = intByte;
intByte = myReader.Read();
}
while (intByte != -)
{
if (endByteInt != -)
{
if (intByte == endByteInt && lastIntByte != )
{
ReadInt();
break;
}
}
else if (intByte == )
{
break;
} strBuilder.Append((char)intByte);
intByte = myReader.Read();
}
return strBuilder.ToString();
}
private object ReadValue()
{
var intByte = myReader.Read();
if (intByte == )
{
//函数
var item = new JsonReader(myReader, ).myObjDate;
ReadInt();
return item;
}
else if (intByte == )
{
return ReadValueArray();
}
else
{
return ReadValueString(intByte);
}
}
private string ReadValueArrayString(ref int lastChar)
{
StringBuilder strBuilder = new StringBuilder();
var intByte = lastChar;
if (intByte == )
{
intByte = myReader.Read();
}
var lastIntByte = -;
int endByteInt = -;
if (intByte == -)
{
return null;
}
if (intByte == || intByte == )
{
endByteInt = intByte;
intByte = myReader.Read();
}
while (intByte != -)
{
lastChar = intByte;
if (endByteInt != -)
{
if (intByte == endByteInt && lastIntByte != )
{
break;
}
}
else if (intByte == || (intByte == && lastIntByte != ))
{
break;
} strBuilder.Append((char)intByte);
intByte = ReadInt();
}
return strBuilder.ToString();
}
private object ReadValueString(int lastChar)
{
StringBuilder strBuilder = new StringBuilder();
var intByte = lastChar;
if (intByte == )
{
intByte = myReader.Read();
}
var lastIntByte = -;
int endByteInt = -;
if (intByte == -)
{
return null;
}
if (intByte == || intByte == )
{
endByteInt = intByte;
intByte = myReader.Read();
}
while (intByte != -)
{
if (endByteInt != -)
{
if (intByte == endByteInt && lastIntByte != )
{
ReadInt();
break;
}
}
else if (intByte == || (intByte == && lastIntByte != ))
{
break;
}
strBuilder.Append((char)intByte);
intByte = ReadInt();
}
return strBuilder.ToString();
}
private object[] ReadValueArray()
{
List<object> list = new List<object>();
var intByte = myReader.Read();
while (intByte != )
{
if (intByte == )
{
var item = new JsonReader(myReader, ).myObjDate;
list.Add(item);
if (ReadInt() == )
{
break;
}
}
else if (intByte == )
{
list.Add(ReadValueArray());
}
else
{
list.Add(ReadValueArrayString(ref intByte));
if (intByte == ) { break; }
}
intByte = myReader.Read();
}
return list.ToArray();
}
}
}
.NET Json 解析到Dictionary,原生代码的更多相关文章
- android Json解析详解(详细代码)
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...
- 原生JSON解析
原生JSON解析 JSONObject:JSON数据封装对象JSONArray:JSON数据封装数组 布局: <?xml version="1.0" encoding=&qu ...
- Android JSON 解析关键代码
Android Json 解析其实还是蛮重要的知识点,为什么这么说呢,因为安卓通信大部分的协议都是使用 json 的方式传输,我知道以前大部分是使用的 xml ,但是时代在发展社会在进步,json 成 ...
- 几百行代码实现一个 JSON 解析器
前言 之前在写 gscript时我就在想有没有利用编译原理实现一个更实际工具?毕竟真写一个语言的难度不低,并且也很难真的应用起来. 一次无意间看到有人提起 JSON 解析器,这类工具充斥着我们的日常开 ...
- .Net Core 3.0原生Json解析器
微软官方博客中描述了为什么构造了全新的Json解析器而不是继续使用行业准则Json.Net 微软博客地址:https://devblogs.microsoft.com/dotnet/try-the-n ...
- iOS开发之Swift 4 JSON 解析指南
Apple 终于在 Swift 4 的 Foundation 的模块中添加了对 JSON 解析的原生支持. 虽然已经有很多第三方类库实现了 JSON 解析,但是能够看到这样一个功能强大.易于使用的官方 ...
- ios基础篇(二十七)—— Json解析
一.什么是Json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使 ...
- IOS中Json解析的四种方法
作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验 ...
- JSON 解析第三方框架
常见的 JSON 解析第三方框架 JSONKit(最快) SBJson TouchJSON 以上三个框架的性能依次降低! 介绍 JSONKit 第三方框架的目的 JSON 的解析并不是表面上那么简单 ...
随机推荐
- BZOJ 1012
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 7912 Solved: 3441[Submi ...
- html css中id和class的区别比较
在定义样式的时候,有时候会将id和class的用法弄混淆,所以在这里特意说明一下: id和class属性是网页中两个通用的属性,它们协同工作使整个页面变得丰富多彩.当我们为一个元素定义样式时.可以使用 ...
- 实现类似 QQ音乐网页版 的单页面总结
最近需要对创业团队的网站进行改版,而我负责前端设计和实现. 下面是一些总结与体会: 当设计完成之前,我就跟和我配合的Java 后台说用iframe实现,结果说麻烦不肯,到最后突然对我说还是用ifram ...
- Git - Eclipse 提交工程至 GitHub
1. 在 GitHub 新建一个工程 hello-world,repository 地址是 https://github.com/username/hello-world.git 2. 在 Eclip ...
- sql中的case when语句
1.在where子句中: CREATE TABLE `hello`.`sometbl` ( `id` INT NOT NULL AUTO_INCREMENT , `a` VARCHAR(45) NUL ...
- 使用zipalign.exe工具优化APK安装包
zipalign.exe是Android自带的一个档案整理工具,它可以用于优化APK安装包,从而提升Android应用与系统之间的交互效率,提升应用程序的运行速度. 操作步骤: 1.在命令行窗口输入如 ...
- Android重力感应开发
http://blog.csdn.net/mad1989/article/details/20848181 一.手机中常用的传感器 在Android2.3 gingerbread系统中,google提 ...
- Linux学习三部曲(之二)
新建Linux分区以及文件系统 今天,我们来聊聊在linux上建立分区和文件系统.windows系统建立分区可以借助分区工具,那么在linux分区以及文件系统又该如何操作呢? 打开secureCRT, ...
- 利用AVL树实现搬箱问题的best fit策略
//my.h //定义两个数据类型,货物Goods,箱子Box #include <vector> #include <cstddef> #include <iostre ...
- android浪漫樱花凋零动态壁纸应用源码
android浪漫樱花凋零动态壁纸应用源码,是从那个安卓教程网拿过来的,本项目是一套基于安卓的樱花动态壁纸项目源码,安装以后桌面没有图标,但是可以在修改壁纸-动态壁纸中找到.我的分辨率是480×854 ...