JsonFormatter PrettyPrint

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace prettycode.org
{
    public static class JsonFormatter
    {
        public static string JsCasePropertyNames(string json)
        {
            var buffer = new StringBuilder();
            var inString = false;

            for (var i = 0; i < json.Length; i++)
            {
                var currentChar = json[i];
                char? previousChar = (i > 0) ? (char?)json[i - 1] : null;

                if (currentChar == ‘"‘ && previousChar.HasValue && previousChar != ‘\\‘)
                {
                    inString = !inString;
                }

                if (inString && currentChar == ‘"‘ && "{,".Contains(previousChar.Value))
                {
                    buffer.Append("\"" + Char.ToLowerInvariant(json[++i]));
                }
                else
                {
                    buffer.Append(currentChar);
                }
            }

            return buffer.ToString();
        }

        public static string PrettyPrint(string json, string indent = "   ")
        {
            var buffer = new StringBuilder();
            var depth = 0;
            var inString = false;

            for (var i = 0; i < json.Length; i++)
            {
                var currentChar = json[i];

                if (currentChar == ‘"‘ && i > 0 && json[i - 1] != ‘\\‘)
                {
                    inString = !inString;
                }

                if (inString)
                {
                    buffer.Append(currentChar);
                }
                else if (currentChar == ‘{‘ || currentChar == ‘[‘)
                {
                    buffer.Append(currentChar + "\n" + string.Concat(Enumerable.Repeat(indent, ++depth)));
                }
                else if (currentChar == ‘}‘ || currentChar == ‘]‘)
                {
                    buffer.Append("\n" + string.Concat(Enumerable.Repeat(indent, --depth)) + currentChar);
                }
                else if (currentChar == ‘,‘)
                {
                    buffer.Append(",\n" + string.Concat(Enumerable.Repeat(indent, depth)));
                }
                else if (currentChar == ‘:‘)
                {
                    buffer.Append(": ");
                }
                else
                {
                    buffer.Append(currentChar);
                }
            }

            return buffer.ToString();
        }
    }
}
时间: 2024-08-27 14:22:46

JsonFormatter PrettyPrint的相关文章

logrus日志框架

目录 logrus介绍 logrus配置 日志打印 HOOK机制 Gin日志 Fatal处理 线程安全 logrus介绍 golang标准库的日志框架非常简单,仅仅提供了print,panic和fatal三个函数.对于更精细的日志级别.日志文件分割,以及日志分发等方面,并没有提供支持.在golang的世界,流行的日志框架包括logrus.zap.zerolog.seelog等. logrus配置 1. 日志级别: logrus有7个日志级别,依次是Trace << Debug <<

How can I pretty-print JSON in python?

python -m json.tool my_json.json 转自: http://stackoverflow.com/questions/352098/how-can-i-pretty-print-json

使用OAuth打造webapi认证服务供自己的客户端使用

一.什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版.注意是Authorization(授权),而不是Authentication(认证).用来做Authentication(认证)的标准叫做openid connect,我们将在以后的文章中进行介绍. 二.名词定义 理解OAuth中的专业术语能够帮助你理解其流程模式,OAuth中常用的名词术语有4个,为了便于理解这些术语,我们先假设一个很常见的授权场景: 你访问了一个日志网站(thir

使用PYTHON创建XML文档_python

当用GOOGLE查的时候,内容几乎都是一样的.但是你想要的东西,一个也没有.例如,我就找不到中国人写的如何使用PYTHON来创建一个XML文件.当然,直接用文件写的方式也能够达到同样的效果,但是毕竟容易出错,而且看起来不优雅.最后,我看了很多资料,终于明白如何使用PYTHON写一个XML文件了.以下就是一个简单的例子,这个例子是已经调试通过的,大家可以放心使用. import xml.dom.minidom from xml.dom.DOMImplementation import implem

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

WebApi学习笔记

1.与mvc区别:    (1)controller继承自ApiController        (2)action不返回视图而是返回数据    (3)访问:http://localhost:1671/api/products/(productscontroller) 2.浏览器访问结果区别    (1)火狐.谷歌返回xml     (2)IE返回json包     原因:出现这种差别的原因是IE和Firefox发送了不同的Accept报头,因此,Web API在响应中发送了不同的内容类型  

javascript event(事件对象)详解

1. 事件对象 thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.45;vertical-align:top;border-top:1px solid #ddd}.table>thead

Entity Framework 6 Recipes 2nd Edition(9-3)译-&gt;找出Web API中发生了什么变化

9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Frist实现数据访问管理. 本例,我们模拟一个N层场景,用单独的客户端(控制台应用)来调用单独的基于REST服务的Web网站(WEB API应用) . 注意:每层使用单独的Visual Studio 解决方案, 这样更方便配置.调试和模拟一个N层应用. 假设有一个如Figure 9-3所示的旅行社和预订

Apache OFbiz MiniLang 源码解读

MiniLang所有元素的父类--MiniLangElement MiniLang 是基于XML的"描述型语言".所有的元素,包括节点.属性都继承自该类.它包含三个属性: lineNumber:表示解析MiniLang的源码(通常是Java)所处的行号,主要是为了便于日志记录 tagName:当前元素的tag名称,主要用于日志记录 simpleMethod:simpleMethod是一个大的"传输对象",里面实现了MiniLang支持的所有执行方式,其作用类似于se