C# 解析Json格式

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

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

 我自己写的将会在测试后分享,现在分享一个比较好的博客:http://www.cnblogs.com/wangwei123/archive/2010/05/14/1735257.html

以下代码来自:http://www.cnblogs.com/dnawo/archive/2010/01/06/1640684.html

 

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( 01) ==  " { ")
                    _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< stringobject> 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 -  11);
        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 -  11);
        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< stringobject>
{}

///   <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>
{}

 

相关文章
|
3月前
|
JSON 缓存 自然语言处理
多语言实时数据微店商品详情API:技术实现与JSON数据解析指南
通过以上技术实现与解析指南,开发者可高效构建支持多语言的实时商品详情系统,满足全球化电商场景需求。
|
5月前
|
存储 JSON 关系型数据库
【干货满满】解密 API 数据解析:从 JSON 到数据库存储的完整流程
本文详解电商API开发中JSON数据解析与数据库存储的全流程,涵盖数据提取、清洗、转换及优化策略,结合Python实战代码与主流数据库方案,助开发者构建高效、可靠的数据处理管道。
|
4月前
|
JSON 算法 API
淘宝商品评论API接口核心解析,json数据返回
淘宝商品评论API是淘宝开放平台提供的数据服务接口,允许开发者通过编程方式获取指定商品的用户评价数据,包括文字、图片、视频评论及评分等。其核心价值在于:
|
3月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
228 19
|
2月前
|
JSON Java Go
【GoGin】(2)数据解析和绑定:结构体分析,包括JSON解析、form解析、URL解析,区分绑定的Bind方法
bind或bindXXX函数(后文中我们统一都叫bind函数)的作用就是将,以方便后续业务逻辑的处理。
284 3
|
2月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
204 0
|
6月前
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
233 67
|
3月前
|
JSON 自然语言处理 API
多语言实时数据淘宝商品评论API:技术实现与JSON数据解析指南
淘宝商品评论多语言实时采集需结合官方API与后处理技术实现。建议优先通过地域站点适配获取本地化评论,辅以机器翻译完成多语言转换。在合规前提下,企业可构建多语言评论数据库,支撑全球化市场分析与产品优化。
|
JSON 前端开发 Java
Json格式数据解析
Json格式数据解析
492 1
|
11月前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。

推荐镜像

更多
  • DNS