json作为常用数据文件,为了传输的效率,在传输前要进行压缩,而在传输后要进行格式化,以便阅读。下面是使用C#完成的格式化和压缩代码。

 public static string Compress(string json)
{
StringBuilder sb = new StringBuilder();
using (StringReader reader = new StringReader(json))
{
int ch = -;
int lastch = -;
bool isQuoteStart = false;
while ((ch = reader.Read()) > -)
{
if ((char)lastch != '\\' && (char)ch == '\"')
{
if (!isQuoteStart)
{
isQuoteStart = true;
}
else
{
isQuoteStart = false;
}
}
if (!Char.IsWhiteSpace((char)ch) || isQuoteStart)
{
sb.Append((char)ch);
}
lastch = ch;
}
}
return sb.ToString();
}

因为在json中"是用作隔离key和value的,而"又可以作为value中的一部分,所以在处理中要判断是否是单独的",还是作为隔离符号,所以要进行如上的判断。

public static string Format(string json)
{
string strCompress = Compress(json);
StringBuilder sb = new StringBuilder();
#region format using (StringReader reader = new StringReader(strCompress))
{
using (StringWriter writer = new StringWriter(sb))
{
int ch = -;
int lastch = -;
bool isQuoteStart = false;
while ((ch = reader.Read()) > -)
{
StringBuilder temp = new StringBuilder();
switch ((char)ch)
{
case '{':
if (isQuoteStart)
{
temp.Append('{');
}
else
{
temp.Append('{');
if ((char)reader.Peek() != '}')
{
temp.Append(Environment.NewLine);
}
}
break;
case '}':
if (isQuoteStart)
{
temp.Append('}');
}
else
{
if ((char)lastch != '{' && (char)lastch != '}')
{
temp.Append(Environment.NewLine);
}
temp.Append('}');
if ((char)reader.Peek() != ',')
{
temp.Append(Environment.NewLine);
}
}
break;
case '[':
if (isQuoteStart)
{
temp.Append('[');
}
else
{
temp.Append('[');
if ((char)reader.Peek() != ']')
{
temp.Append(Environment.NewLine);
}
}
break;
case ']':
if (isQuoteStart)
{
temp.Append(']');
}
else
{
if ((char)lastch != '[' && (char)lastch != ']')
{
temp.Append(Environment.NewLine);
}
temp.Append(']');
if ((char)reader.Peek() != ',' && (char)reader.Peek() != '}')
{
temp.Append(Environment.NewLine);
}
}
break;
case '\"':
if ((char)lastch != '\\')
{
if (!isQuoteStart)
{
isQuoteStart = true;
}
else
{
isQuoteStart = false;
}
}
temp.Append("\"");
break;
case ':':
if (isQuoteStart)
{
temp.Append(':');
}
else
{
temp.Append(':');
temp.Append(" ");
}
break;
case ',':
if (isQuoteStart)
{
temp.Append(',');
}
else
{
temp.Append(',');
temp.Append(Environment.NewLine);
}
break;
case ' ':
if (isQuoteStart)
{
temp.Append(" ");
}
else
{
temp.Append("");
temp.Append(Environment.NewLine);
}
break;
default:
temp.Append((char)ch);
break;
}
writer.Write(temp.ToString());
lastch = ch;
}
}
}
#endregion format #region indent
StringBuilder res = new StringBuilder();
using (StringReader reader = new StringReader(sb.ToString()))
{
using (StringWriter writer = new StringWriter(res))
{
string str = null; int nspace = ;
string space = "\t";
bool bEndMid = false;
while ((str = reader.ReadLine()) != null)
{
if (str.Length == ) continue;
if (str.EndsWith("},"))
{
nspace--;
}
StringBuilder temp = new StringBuilder();
if (!bEndMid)
{
for (int i = ; i < (str.EndsWith("],") || (str.EndsWith("}") && !str.EndsWith("{}")) || str.EndsWith("]") ? nspace - : nspace); i++)
{
temp.Append(space);
}
} temp.Append(str);
if (str.EndsWith("["))
{
writer.Write(temp);
bEndMid = true;
}
else
{
writer.WriteLine(temp);
bEndMid = false;
}
if (!(str.EndsWith("{}") || str.EndsWith("[]")))
{
if (str.StartsWith("{") || str.EndsWith("{") ||
str.EndsWith("["))
{
nspace++;
}
if (str.EndsWith("}") || str.EndsWith("]"))
{
nspace--;
}
}
}
}
}
return res.ToString();
#endregion indent
}

对"的考虑同compress,但格式化的话需要考虑到缩进,而放到一起考虑比较麻烦,所以先进行了格式化,然后在处理缩进,这样就简化了逻辑。

C#实现json压缩和格式化的更多相关文章

  1. SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型

    SQL 横转竖 .竖专横 (转载)   普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...

  2. PHP json字符串,格式化缩进显示

    PHP json字符串,格式化显示 /** * 格式化 */ class JsonFormatHelper { /** * json字符串缩进显示 * @param unknown $json * @ ...

  3. 对Json字符串进行格式化显示

    很多时候,我们拿Json字符串作为返回结果,但是当数据量多的时候,一堆的Json字符串看起来很不直观,这时候我们可以使用以下办法将Json字符串格式化一下再输出 var JsonUti = { //定 ...

  4. net.sf.json日期类型格式化输出

    net.sf.json 日期类型格式化输出 Date, Timestamp ; 编写工具类 package cn.jorcen.commons.util; import java.text.DateF ...

  5. 利用Gson将JSON数据进行格式化(pretty print)

    我们可以利用Gson包将String类型的JSON数据进行格式化. Gson gson = new GsonBuilder().setPrettyPrinting().create(); JsonPa ...

  6. 模拟实现JSON.stringiry 的格式化输出

    前言 这是一道笔试题,要求模拟实现JSON.stringiry 的格式化输出,按照层级缩进,输出易读格式,即完成以下方法 JSON.stringify(jsObj, null, 4); // 缩进4个 ...

  7. JSON字符串控制台格式化输出 java

    1.正常情况下返回的json数据格式如下: {"header":{"transSn":"e33128bb7622462ebfb2cbfcc46baa1 ...

  8. grunt配置太复杂?使用Qbuild进行文件合并、压缩、格式化等处理

    上次简单介绍了下Qbuild的特点和配置,其实实现一个自动化工具并不复杂,往简单里说,无非就是筛选文件和处理文件.但Qbuild的源码也并不少,还是做了不少工作的. 1. 引入了插件机制.在Qbuil ...

  9. Json.net日期格式化

    1. 全局设置,可以在App_Global中配置 JsonSerializerSettings setting = new JsonSerializerSettings(); JsonConvert. ...

随机推荐

  1. 【EMV L2】Processing Restrictions

    目的: 处理限制(Processing Restrictions)的目的是确定终端中的应用程序与ICC中的应用程序的兼容程度,并进行任何必要的调整,包括可能拒绝交易. 执行条件: 终端应该都要执行Pr ...

  2. vue中使用video插件vue-video-player

    一.安装插件 npm install vue-video-player --save 二.配置插件 在main.js中全局配置插件 import VideoPlayer from 'vue-video ...

  3. idea 启动 springBoot debug很慢,正常启动很快是什么原因

    说实话,从我开始使用springboot框架以来,就一直遇到这个问题,我刚把项目从SSM框架转成 spring boot 框架时,就发现有时候启动项目特别慢,有时候特别快,当时觉得特别奇怪,但也一直没 ...

  4. js中数组常用方法总结

    操作数组 印象中数组有很多方法,系统的整理一下,放在自己家里方便回头查~ Array.map() 此方法是将数组中的每个元素调用一个提供的函数,结果作为一个新的数组返回,并没有改变原来的数组 1 2 ...

  5. poj 1113 凸包

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  6. 2019嘉韦思杯线上初赛writeup

    1 土肥原贤二 看到页面怀疑是sql注入,写了个4'进去就发生报错.could not to the database You have an error in your SQL syntax; ch ...

  7. 20164301 Exp5 MSF基础应用

    Exp5 MSF基础应用 1. 实践内容 1.1一个主动攻击实践,如ms08_067,smb_delivery(唯一) 1.2 一个针对浏览器的攻击,如ms10_046: 1.3 一个针对客户端的攻击 ...

  8. Web 安全之 XSS 攻击与防御

    前言 黑客,相信大家对这一名词并不陌生,黑客们往往会利用 Web 应用程序的漏洞来攻击咱们的系统.开放式 Web 应用程序安全项目(OWASP, Open Web Application Securi ...

  9. 记SCOI2019

    离精英体验营结束已两周的,要哭的要笑的现在也一定释怀了.是时候冷静分析一下这次的考试了.时间序虽然有流水账的嫌疑,但这毕竟是OI界的流行风气. day0 早上坐学校包的商务车去了电子科技大学.走在来过 ...

  10. Viewport模版

    通用模版 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...