博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 解析Json格式
阅读量:5863 次
发布时间:2019-06-19

本文共 5859 字,大约阅读时间需要 19 分钟。

Json格式其实就是Key-Value,只不过这个Value还可能是一个Key-Value,如果将外面的当成一个json对象,那么这个key可能就是一个新的json对象。在C#中,较难解析的可能是后面的这个Value是一个数组,而这个数据里面又有新的数组,因为我是搞GIS的,和点,线,面这样的数据打交道,所以对此深有体会,因为一个线可以有多个path构成,而一个path可以由多个point构成,了解这些其实也就是一个高级对象的形成过程,对象就是真实世界的抽象,对象和对象之间的关系就如json格式一样,看来这些东西都是相通的呀,好了言归正传。

 我自己写的将会在测试后分享,现在分享一个比较好的博客:

以下代码来自:

 

JSON解析类 
Code highlighting produced by Actipro CodeHighlighter (freeware)
http:
//
www.CodeHighlighter.com/
-->
//
using System.Collections.Generic;
//
using System.Text;
//
using System.Text.RegularExpressions;
///
 
<summary>
///
 类  名:JSONConvert
///
 描  述:JSON解析类
///
 编  写:dnawo
///
 站  点:
http://www.mzwu.com/
///
 日  期:2010-01-06
///
 版  本:1.1.0
///
 
</summary>
public 
static 
class JSONConvert
{
    
#region 全局变量
    
private 
static JSONObject _json = 
new JSONObject();
//
寄存器
    
private 
static 
readonly 
string _SEMICOLON = 
"
@semicolon
";
//
分号转义符
    
private 
static 
readonly 
string _COMMA = 
"
@comma
"
//
逗号转义符
    
#endregion
    
#region 字符串转义
    
///
 
<summary>
    
///
 字符串转义,将双引号内的:和,分别转成_SEMICOLON和_COMMA
    
///
 
</summary>
    
///
 
<param name="text"></param>
    
///
 
<returns></returns>
    
private 
static 
string StrEncode(
string text)
    {
        MatchCollection matches = Regex.Matches(text, 
"
\\\"[^\\\"]+\\\"
");
        
foreach (Match match 
in matches)
        {
            text = text.Replace(match.Value, match.Value.Replace(
"
:
", _SEMICOLON).Replace(
"
,
", _COMMA));
        }
        
return text;
    }
    
///
 
<summary>
    
///
 字符串转义,将_SEMICOLON和_COMMA分别转成:和,
    
///
 
</summary>
    
///
 
<param name="text"></param>
    
///
 
<returns></returns>
    
private 
static 
string StrDecode(
string text)
    {
        
return text.Replace(_SEMICOLON, 
"
:
").Replace(_COMMA, 
"
,
");
    }
    
#endregion
    
#region JSON最小单元解析
    
///
 
<summary>
    
///
 最小对象转为JSONObject
    
///
 
</summary>
    
///
 
<param name="text"></param>
    
///
 
<returns></returns>
    
private 
static JSONObject DeserializeSingletonObject(
string text)
    {
        JSONObject jsonObject = 
new JSONObject();
        MatchCollection matches = Regex.Matches(text, 
"
(\\\"(?<key>[^\\\"]+)\\\":\\\"(?<value>[^,\\\"]+)\\\")|(\\\"(?<key>[^\\\"]+)\\\":(?<value>[^,\\\"\\}]+))
");
        
foreach (Match match 
in matches)
        {
            
string value = match.Groups[
"
value
"].Value;
            jsonObject.Add(match.Groups[
"
key
"].Value, _json.ContainsKey(value) ? _json[value] : StrDecode(value));
        }
        
return jsonObject;
    }
    
///
 
<summary>
    
///
 最小数组转为JSONArray
    
///
 
</summary>
    
///
 
<param name="text"></param>
    
///
 
<returns></returns>
    
private 
static JSONArray DeserializeSingletonArray(
string text)
    {
        JSONArray jsonArray = 
new JSONArray();
        MatchCollection matches = Regex.Matches(text, 
"
(\\\"(?<value>[^,\\\"]+)\")|(?<value>[^,\\[\\]]+)
");
        
foreach (Match match 
in matches)
        {
            
string value = match.Groups[
"
value
"].Value;
            jsonArray.Add(_json.ContainsKey(value) ? _json[value] : StrDecode(value));
        }
        
return jsonArray;
    }
    
///
 
<summary>
    
///
 反序列化
    
///
 
</summary>
    
///
 
<param name="text"></param>
    
///
 
<returns></returns>
    
private 
static 
string Deserialize(
string text)
    {
        text = StrEncode(text);
//
转义;和,
        
int count = 
0;
        
string key = 
string.Empty;
        
string pattern = 
"
(\\{[^\\[\\]\\{\\}]+\\})|(\\[[^\\[\\]\\{\\}]+\\])
";
        
while (Regex.IsMatch(text, pattern))
        {
            MatchCollection matches = Regex.Matches(text, pattern);
            
foreach (Match match 
in matches)
            {
                key = 
"
___key
" + count + 
"
___
";
                
if (match.Value.Substring(
0
1) == 
"
{
")
                    _json.Add(key, DeserializeSingletonObject(match.Value));
                
else
                    _json.Add(key, DeserializeSingletonArray(match.Value));
                text = text.Replace(match.Value, key);
                count++;
            }
        }
        
return text;
    }
    
#endregion
    
#region 公共接口
    
///
 
<summary>
    
///
 序列化JSONObject对象
    
///
 
</summary>
    
///
 
<param name="text"></param>
    
///
 
<returns></returns>
    
public 
static JSONObject DeserializeObject(
string text)
    {
        
return _json[Deserialize(text)] 
as JSONObject;
    }
    
///
 
<summary>
    
///
 序列化JSONArray对象
    
///
 
</summary>
    
///
 
<param name="text"></param>
    
///
 
<returns></returns>
    
public 
static JSONArray DeserializeArray(
string text)
    {
        
return _json[Deserialize(text)] 
as JSONArray;
    }
    
    
///
 
<summary>
    
///
 反序列化JSONObject对象
    
///
 
</summary>
    
///
 
<param name="jsonObject"></param>
    
///
 
<returns></returns>
    
public 
static 
string SerializeObject(JSONObject jsonObject)
    {
        StringBuilder sb = 
new StringBuilder();
        sb.Append(
"
{
");
        
foreach (KeyValuePair<
string
object> kvp 
in jsonObject)
        {
            
if (kvp.Value 
is JSONObject)
            {
                sb.Append(
string.Format(
"
\"{0}\":{1},
", kvp.Key, SerializeObject((JSONObject)kvp.Value)));
            }
            
else 
if (kvp.Value 
is JSONArray)
            {
                sb.Append(
string.Format(
"
\"{0}\":{1},
", kvp.Key, SerializeArray((JSONArray)kvp.Value)));
            }
            
else 
if (kvp.Value 
is String)
            {
                sb.Append(
string.Format(
"
\"{0}\":\"{1}\",
", kvp.Key, kvp.Value));
            }
            
else
            {
                sb.Append(
string.Format(
"
\"{0}\":\"{1}\",
", kvp.Key, 
""));
            }
        }
        
if (sb.Length > 
1)
            sb.Remove(sb.Length - 
1
1);
        sb.Append(
"
}
");
        
return sb.ToString();
    }
    
    
///
 
<summary>
    
///
 反序列化JSONArray对象
    
///
 
</summary>
    
///
 
<param name="jsonArray"></param>
    
///
 
<returns></returns>
    
public 
static 
string SerializeArray(JSONArray jsonArray)
    {
        StringBuilder sb = 
new StringBuilder();
        sb.Append(
"
[
");
        
for (
int i = 
0; i < jsonArray.Count; i++)
        {
            
if (jsonArray[i] 
is JSONObject)
            {
                sb.Append(
string.Format(
"
{0},
", SerializeObject((JSONObject)jsonArray[i])));
            }
            
else 
if (jsonArray[i] 
is JSONArray)
            {
                sb.Append(
string.Format(
"
{0},
", SerializeArray((JSONArray)jsonArray[i])));
            }
            
else 
if (jsonArray[i] 
is String)
            {
                sb.Append(
string.Format(
"
\"{0}\",
", jsonArray[i]));
            }
            
else
            {
                sb.Append(
string.Format(
"
\"{0}\",
"
""));
            }
        }
        
if (sb.Length > 
1)
            sb.Remove(sb.Length - 
1
1);
        sb.Append(
"
]
");
        
return sb.ToString();
    }
    
#endregion
}
///
 
<summary>
///
 类  名:JSONObject
///
 描  述:JSON对象类
///
 编  写:dnawo
///
 站  点:
http://www.mzwu.com/
///
 日  期:2010-01-06
///
 版  本:1.1.0
///
 更新历史:
///
     2010-01-06  继承Dictionary
<TKey, TValue>
代替this[]
///
 
</summary>
public 
class JSONObject : Dictionary<
string
object>
{}
///
 
<summary>
///
 类  名:JSONArray
///
 描  述:JSON数组类
///
 编  写:dnawo
///
 站  点:
http://www.mzwu.com/
///
 日  期:2010-01-06
///
 版  本:1.1.0
///
 更新历史:
///
     2010-01-06  继承List
<T>
代替this[]
///
 
</summary>
public 
class JSONArray : List<
object>
{}

 

转载地址:http://ytunx.baihongyu.com/

你可能感兴趣的文章
JSP页面固定页面为绝对路径
查看>>
在大数据分析/挖掘领域,哪些编程语言应用最多?
查看>>
.Net中的AOP系列之《方法执行前后——边界切面》
查看>>
NOIP2003pj数字游戏[环形DP]
查看>>
条件编译,头文件,静态库,共享库与多文件编程
查看>>
Crontab的格式
查看>>
解决手机浏览器上input 输入框导致页面放大的问题(记录)
查看>>
合格linux运维人员必会的30道shell编程面试题及讲解
查看>>
[Java]Socket和ServerSocket学习笔记
查看>>
shell的exec命令
查看>>
SQL多表连接查询(详细实例)(转)
查看>>
selinux改变状态不需要重启的方法
查看>>
GRDB自定义的纯函数
查看>>
Wireshark基本介绍和TCP三次握手
查看>>
Maven服务器的使用之Maven桌面项目和Maven Web项目的创建
查看>>
【Web API系列教程】1.1 — ASP.NET Web API入门
查看>>
kubernetes多节点的pod挂载同一个cephfs目录
查看>>
【iCore4 双核心板_FPGA】例程一:GPIO输出实验——点亮LED
查看>>
VB.NET版+三层实现登陆
查看>>
Linq EF 根据字符列表排序或List根据列表排序以及Linq查询类型转换
查看>>