.NET FrameWork 2.0 并没有提供JSON 字符串对象化工具,因此尝试写了这个转换器, 目前已投入使用,分享一下. 实现方式是:正则 + 递归. 对需要转换的Json 字符串复杂度没有要求. 欢迎测试,并提供反馈,谢谢. 第一次运行,有点慢,估计是初使化正则占用了时间,这些正则是静态的,之后的转换会加快.
/*create by ayymbirst @gmail.com */
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace JsonConver
{
/// <summary>
/// 节点枚举
/// </summary>
public enum NodeType
{
/// <summary>
/// 标识数组
/// </summary>
IsArray
,
/// <summary>
/// 标识对象
/// </summary>
IsObject
,
/// <summary>
/// 标识元数据
/// </summary>
IsOriginal
,
/// <summary>
/// 未知格式
/// </summary>
Undefined
}
//描述Json节点
public class JsonNode
{
public NodeType NodeType;
public List<JsonNode> List;
public Dictionary<string, JsonNode> DicObject;
public string Value;
}
/// <summary>
/// json 字符串对象化
/// </summary>
public class ConvertJsonObject
{
static string regTxt = "({0}[^{0}{1}]*(((?'Open'{0})[^{0}{1}]*)+((?'-Open'{1})[^{0}{1}]*)+)*(?(Open)(?!)){1})";
//匹配字符串(单双引号范围)
static string regKeyValue = "({0}.{1}?(?<!\\\\){0})"; //判断是否包含单,双引号
//匹配元数据(不包含对象,数组)
static string regOriginalValue = string.Format("({0}|{1}|{2})", string.Format(regKeyValue, "'", "*"), string.Format(regKeyValue, "\"", "*"), "\\w+");
//匹配value (包含对象数组)
static string regValue = string.Format("({0}|{1}|{2})", regOriginalValue //字符
, string.Format(regTxt, "\\[", "\\]"), string.Format(regTxt, "\\{", "\\}"));
//匹配键值对
static string regKeyValuePair = string.Format("\\s*(?<key>{0}|{1}|{2})\\s*:\\s*(?<value>{3})\\s*"
, string.Format(regKeyValue, "'", "+"), string.Format(regKeyValue, "\"", "+"), "([^ :,]+)" //匹配key
, regValue); //匹配value
/// <summary>
/// 判断是否是对象
/// </summary>
static Regex RegJsonStrack1 = new Regex(string.Format("^\\{0}(({2})(,(?=({2})))?)+\\{1}$", "{", "}", regKeyValuePair), RegexOptions.Compiled);
/// <summary>
/// 判断是否是序列
/// </summary>
static Regex RegJsonStrack2 = new Regex(string.Format("^\\[(({0})(,(?=({0})))?)+\\]$", regValue), RegexOptions.Compiled);
/// <summary>
/// 判断键值对
/// </summary>
static Regex RegJsonStrack3 = new Regex(regKeyValuePair, RegexOptions.Compiled);
//匹配value
static Regex RegJsonStrack4 = new Regex(regValue, RegexOptions.Compiled);
//匹配元数据
static Regex RegJsonStrack6 = new Regex(string.Format("^{0}$", regOriginalValue), RegexOptions.Compiled);
//移除两端[] , {}
static Regex RegJsonRemoveBlank = new Regex("(^\\s*[\\[\\{'\"]\\s*)|(\\s*[\\]\\}'\"]\\s*$)", RegexOptions.Compiled);
string JsonTxt;
public ConvertJsonObject(string json)
{
//去掉换行符
json = Regex.Replace(json, "[\r\n]", "");
JsonTxt = json;
}
/// <summary>
/// 判断节点内型
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public NodeType MeasureType(string json)
{
if (RegJsonStrack1.IsMatch(json))
{
return NodeType.IsObject;
}
if (RegJsonStrack2.IsMatch(json))
{
return NodeType.IsArray;
}
if (RegJsonStrack6.IsMatch(json))
{
return NodeType.IsOriginal;
}
return NodeType.Undefined;
}
/// <summary>
/// json 字符串序列化为对象
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public JsonNode SerializationJsonNodeToObject()
{
return SerializationJsonNodeToObject(JsonTxt);
}
/// <summary>
/// json 字符串序列化为对象
/// </summary>
/// <param name="json"></param>
/// <returns></returns>
public JsonNode SerializationJsonNodeToObject(string json)
{
json = json.Trim();
NodeType nodetype = MeasureType(json);
if (nodetype == NodeType.Undefined)
{
throw new Exception("未知格式Json: " + json);
}
JsonNode newNode = new JsonNode();
newNode.NodeType = nodetype;
if (nodetype == NodeType.IsArray)
{
json = RegJsonRemoveBlank.Replace(json, "");
MatchCollection matches = RegJsonStrack4.Matches(json);
newNode.List = new List<JsonNode>();
foreach (Match match in matches)
{
if (match.Success)
{
newNode.List.Add(SerializationJsonNodeToObject(match.Value));
}
}
}
else if (nodetype == NodeType.IsObject)
{
json = RegJsonRemoveBlank.Replace(json, "");
MatchCollection matches = RegJsonStrack3.Matches(json);
newNode.DicObject = new Dictionary<string, JsonNode>();
string key;
foreach (Match match in matches)
{
if (match.Success)
{
key = RegJsonRemoveBlank.Replace(match.Groups["key"].Value, "");
if (newNode.DicObject.ContainsKey(key))
{
throw new Exception("json 数据中包含重复键, json:" + json);
}
newNode.DicObject.Add(key, SerializationJsonNodeToObject(match.Groups["value"].Value));
}
}
}
else if (nodetype == NodeType.IsOriginal)
{
newNode.Value = RegJsonRemoveBlank.Replace(json, "").Replace("\\r\\n", "\r\n");
}
return newNode;
}
}
}
其中 JsonNode 是返回解析结果
NodeType 是枚举类型,表示当前节点是什么类型.
IsArray: JsonNode.List
IsObject:JsonNode.DicObject
IsOriginal:JsonNode.Value
Json 字符串换行请用双斜杠,如 "aa\\r\\nbb",表示aa,bb 为相邻两行.
调用代码:
JsonConver.ConvertJsonObject jsonObj = new JsonConver.ConvertJsonObject("{'a':11,'b':[1,2,3],'c':{'a':1,'b':[1,2,3]}}");
JsonConver.JsonNode node = jsonObj.SerializationJsonNodeToObject();
if (node.NodeType == JsonConver.NodeType.IsObject)
{
if (node.DicObject["a"].NodeType == JsonConver.NodeType.IsOriginal)
{
Console.Write("key:a , value:");
Console.Write(node.DicObject["a"].Value);
Console.WriteLine();
}
if (node.DicObject["b"].NodeType == JsonConver.NodeType.IsArray)
{
Console.Write("key:b,value for first:");
Console.Write(node.DicObject["b"].List[0].Value);
Console.WriteLine();
}
if (node.DicObject["c"].NodeType == JsonConver.NodeType.IsObject)
{
if (node.DicObject["c"].DicObject["a"].NodeType == JsonConver.NodeType.IsOriginal)
{
Console.Write("key:c 子对象值: , value:");
Console.Write(node.DicObject["c"].DicObject["a"].Value);
Console.WriteLine();
}
}
}
Console.Read();
分享到:
相关推荐
.Net2.0的哦 仅保留了读取和解析json数据的相关类和方法(JsonReader,JsonSerializer),去除了写入json数据以及json和xml互相转换的部分以及其他不常用的类。 编译后dll仅20kb 也可以直接将类添加到项目中使用,非常...
JSON.NET .NET2.0版本
Newtonsoft.Json.dll(.NET2.0_3.5_4.0_4.5) using Newtonsoft.Json; //DataTable转json public string DtToJson(DataTable table) { string jsonString = string.Empty; jsonString = JsonConvert....
JSON 对象转换 JSON转换 JSON解析 解析JSON 对象之间转换,与实体转换
Newtonsoft.Json.Net2.0 .net3.5 .net4.0 .net4.5 包含Newtonsoft.Json.Net的各个版本.net2.0、.net3.5、.net4.0、.net4.5、Portable、Portable40、WinRT。Newtonsoft .Json.dll 在C#中使用格式化json特别方便。
Bin文件夹下有个各个版本的dll。 .net2.0的显示.net3.5但是适用.net2.0
压缩包内包含2.0和3.5-4.0两个文件夹,分别存放了适合于.net 2.0及4.0或3.5下使用的Newtonsoft.Json.dll类。 是两个已经编译好的dll文件。亲自验证可正常使用
Newtonsoft.Json.Net20 Json 序列化反序列化
添加引用 System.Core.dll(网上下载即可)和System.Web.Extensions(在.net选项卡中选择). 看代码中,有解释的。 有不明白的地方,发信我们来交流。谢谢。
压缩包内包含2.0/3.5/4.0三个文件夹,每个文件下都有一个Newtonsoft.Json.dll类都是已经编译好的dll文件,复制到.net项目中即可使用。其余包含Silverlight和手机端的文件夹比较全的json序列化压缩包。
Newtonsoft.Json c# 最好用的json序列化组件、包含.net2.0版本,老项目也可以用
asp.net2.0的一般处理程序的使用说明,相信很多初学者都不会使用,所以上传给你们看看
压缩包内包含2.0和3.5-4.0两个文件夹,分别存放了适合于.net 2.0及4.0或3.5下使用的Newtonsoft.Json.dll类。 是两个已经编译好的dll文件
这是一个C#编程语言的JSON转数组或者字典对象,反之也可以,压缩包里有.Net Framework的2.0、3.5、4.0、4.5、Portable和WinRT的版本
c# Json动态库,适用于 (.NET2.0),解压缩后添加引用就可以使用
Json工具类,Newtonsoft.Json.dll .NET 2.0版本,适合.NET Framework2.0框架的系统使用
Newtonsoft.Json 是.net 项目常用的json处理库, 从.net1.1 .net1.3 .net2.0 .net3.5 .net4.0 .net4.5 全部支持
解决:未能加载文件或程序集“Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。
.Net2.0处理JSON问题最精简代码,Newtonsoft.Json太大了,希望这个对大家有帮助。
代码如下:/// <summary> /// JSON解析类 /// </summary> public static class JSONConvert { #region 全局变量 private static JSONObject _json = new JSONObject();//寄存器 private static readonly string _...