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. UTC,BJT时间换算-java

    题目内容: UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8.现在,你的程序要读入一个整数,表示BJT的时和分.整数的个位和十位表示分,百位和千位表示小时.如果小时小于10,则没有千 ...

  2. 【EMV L2】GPO响应以及AIP、AFL

    [GPO命令] 终端通过GPO(Get Processing Options)命令 通知卡片交易开始.命令数据为PDOL指定的终端数据. [GPO响应] 卡片在GPO命令的响应中返回AIP和AFL:A ...

  3. 【EMV L2】2CS.001.00 ~ 2CS.007.00

    测试case要求,对于T=0和T=1卡,命令中是否存在Le是有差异的: - Select: Mandatory Command00 A4 04 00 Lc Command Data LeLc = 05 ...

  4. Hadoop、Strom集群实现日志自动清理

    Hadoop+Storm集群,运行一段时间ZooKeeper等关键进程自动停止运行,经检测是系统磁盘不足 系统磁盘100%: 查找大文件后发现,空间均被ZooKeeper产生的log占用 find / ...

  5. java方法 throws exception 事务回滚机制

    使用spring难免要用到spring的事务管理,要用事务管理又会很自然的选择声明式的事务管理,在spring的文档中说道,spring声明式事务管理默认对非检查型异常和运行时异常进行事务回滚,而对检 ...

  6. PA教材提纲 TAW12-1

    Unit1 Introduction to Object-Oriented Programming(面向对象编程介绍) 1.1 Explaining the Object-Oriented Progr ...

  7. c——闰年

    PTA #include<stdio.h> int main() { int year,month,day,cnt,flag; flag = ; scanf("%4d/%2d/% ...

  8. Winform中Picture控件图片的拖拽显示

    注解:最近做了一个小工具,在Winform中对Picture控件有一个需求,可以通过鼠标从外部拖拽图片到控件的上,释放鼠标,显示图片! 首先你需要对你的整个Fom窗口的AllowDrop设置Ture ...

  9. mysql的常用操作

    基本操作 #1 操作文件夹(库) 增 create database db1 charset utf8; --指定格式为utf8 查 show databases; --查看所有的数据库 show c ...

  10. for循环的运算 改变循环的控制流 死循环 遍历数组 定义方法 有名函数匿名函数 定义函数的方法取值 与 自己创建函数取值 局部与全局变量 次幂/随机数/取绝对值/向上取整/平方根

    今天学习的是for循环,对for循环的运算有了理解. document.write(" ")里的内容在网页上展示出来 有名函数非常重要!!!!!!!!!!!!!!!!!!!!!并且 ...