Json构建与解析

using System;
using System.Text;
using System.Collections;

public class SFJSONObject
{
public Hashtable nameValuePairs = new Hashtable();
private string ins;
private char[] cins;
private int pos;
public SFJSONObject() {
}
public SFJSONObject(String json) {
JSONTokener readFrom = new JSONTokener(json);
Object obj = readFrom.nextValue();

    if(obj is SFJSONObject){
         this.nameValuePairs = ((SFJSONObject)obj).nameValuePairs;
    }
    

}
public object get(string name){
    return nameValuePairs[name];
}
public void put(string key, object value){
    nameValuePairs.Add(key,value);
}
  

public string toString()
{
    string svalue = "{";
    foreach (DictionaryEntry de in nameValuePairs)
    {
        svalue += "\""+de.Key+"\""+":"+"\""+de.Value+"\""+",";
    }

    svalue = svalue.Remove(svalue.Length-1);
    svalue += "}";
    
    return svalue;
}

public string toInlineString()
{
    string svalue = "{";
    foreach (DictionaryEntry de in nameValuePairs)
    {
        svalue += "\\\""+de.Key+"\\\""+":"+"\\\""+de.Value+"\\\""+",";
    }
    
    svalue = svalue.Remove(svalue.Length-1);
    svalue += "}";
    
    return svalue;
}

}

public sealed class JSONTokener
{
/** The input JSON. */
private string ins;
public Hashtable nameValuePairs = new Hashtable();
private int pos;

        public JSONTokener(string ins) {
            // consume an optional byte order mark (BOM) if it exists
         ///   if (ins != null && ins.StartsWith("\ufeff")) {
         //       ins = ins.Substring(1);
         //   }
            this.ins = ins;
            
        }
    
        public Object nextValue(){
            int c = nextCleanInternal();
            switch (c) {
                case -1:
                   // error
                   // APaymentHelperDemo.toAndroidLog(tag, "nextValue -1 error");
                    return null;
    
                case '{':
                    return readObject();
    
                case '\'':
                case '"':
                    return nextString((char) c);
    
                default:
                    // pos--;
                    // APaymentHelperDemo.toAndroidLog(tag, "nextValue default:"+pos+" c:"+c);
                    return null;//readLiteral();
            }
        }
    
        private int nextCleanInternal() {
   
            while (pos < ins.Length) {
                char c = (ins.Substring(pos++,1).ToCharArray())[0];
                switch (c) {
                    case '\t':
                    case ' ':
                    case '\n':
                    case '\r':
                        continue;
    
                    case '/':
                        if (pos == ins.Length)
                        {
                            return c;
                        }

                        char peek = (ins.Substring(pos,1).ToCharArray())[0];
                        switch (peek) {
                            case '*':
                                // skip a /* c-style comment */
                                pos++;
                                int commentEnd = ins.IndexOf("*/", pos);
                                if (commentEnd == -1) {
                                   // throw syntaxError("Unterminated comment");
                                   // error
                                   // APaymentHelperDemo.toAndroidLog(tag, "nextCleanInternal commentEnd == -1");
                                    return 0;
                                }
                                pos = commentEnd + 2;
                                continue;
    
                                case '/':
                                // skip a // end-of-line comment
                                pos++;
                                skipToEndOfLine();
                                continue;
    
                            default:
                                return c;
                        }
    
                    case '#':
                        /*
                         * Skip a # hash end-of-line comment. The JSON RFC doesn't
                         * specify this behavior, but it's required to parse
                         * existing documents. See http://b/2571423.
                         */
                        skipToEndOfLine();
                        continue;
    
                    default:
                        return c;
                }
            }
    
            return -1;
        }
    
        /**
         * Advances the position until after the next newline character. If the line
         * is terminated by "\r\n", the '\n' must be consumed as whitespace by the
         * caller.
         */
        private void skipToEndOfLine() {
            for (; pos < ins.Length; pos++) {
                char c = ins.Substring(pos,1).ToCharArray()[0];
                if (c == '\r' || c == '\n') {
                    pos++;
                    break;
                }
            }
        }
    
        /**
         * Returns the string up to but not including {@code quote}, unescaping any
         * character escape sequences encountered along the way. The opening quote
         * should have already been read. This consumes the closing quote, but does
         * not include it in the returned string.
         *
         * @param quote either ' or ".
         * @throws NumberFormatException if any unicode escape sequences are
         *     malformed.
         */
        public string nextString(char quote)  {
            /*
             * For strings that are free of escape sequences, we can just extract
             * the result as a substring of the input. But if we encounter an escape
             * sequence, we need to use a StringBuilder to compose the result.
             */
            StringBuilder builder = null;
    
            /* the index of the first character not yet appended to the builder. */
            int start = pos;

            while (pos < ins.Length) {
                char c = ins.Substring(pos++,1).ToCharArray()[0];
                if (c == quote) { 
                    if (builder == null) {
                        // a new string avoids leaking memory
                        string str = ins.Substring(start, pos - 1 - start);
                       // APaymentHelperDemo.toAndroidLog(tag, "start:"+start+" end:"+(pos - 1)+" nextString str1:"+str);
                        return str;
                    } else {
                        builder.Append(ins, start, pos - 1 - start);
                      //  APaymentHelperDemo.toAndroidLog(tag, "start:"+start+" end:"+(pos - 1)+" nextString str2:"+builder.ToString());
                        return builder.ToString();
                    }
                }
    
                if (c == '\\') {
                    if (pos == ins.Length) {
                       // throw syntaxError("Unterminated escape sequence");
                       // APaymentHelperDemo.toAndroidLog(tag, "nextString Unterminated escape sequence");
                        return "";
                    }
                    if (builder == null) {
                       builder = new StringBuilder();
                    }
                    builder.Append(ins, start, pos - 1 - start);
                    builder.Append(readEscapeCharacter());
                    start = pos;                        
                }
            }
    
            //throw syntaxError("Unterminated string");
           // APaymentHelperDemo.toAndroidLog(tag, "nextString Unterminated string");
            return "";
        }
    

        private char readEscapeCharacter() {
            char escaped = ins.Substring(pos++,1).ToCharArray()[0];

// APaymentHelperDemo.toAndroidLog(tag, "readEscapeCharacter escaped:"+escaped);
switch (escaped) {
case 'u':
if (pos + 4 > ins.Length) {
// throw syntaxError("Unterminated escape sequence");

                        return ' ';
                    }
                    String hex = ins.Substring(pos, 4);
                    pos += 4;
                    return (char)Int16.Parse(hex);//Integer.parseInt(hex, 16);
    
                case 't':
                    return '\t';
    
                case 'b':
                    return '\b';
    
                case 'n':
                    return '\n';
    
                case 'r':
                    return '\r';
    
                case 'f':
                    return '\f';
    
                case '\'':
                case '"':
                case '\\':
                default:
                    return escaped;
            }
        }
    

        private SFJSONObject readObject()
        {
            SFJSONObject result = new SFJSONObject();
    
            /* Peek to see if this is the empty object. */
            int first = nextCleanInternal();
            if (first == '}') {
                return null;
            } else if (first != -1) {
                pos--;
            }
    
            while (true) {
                Object name = nextValue();
                //APaymentHelperDemo.toAndroidLog(tag, "readObject name:" + name);
                /*
                 * Expect the name/value separator to be either a colon ':', an
                 * equals sign '=', or an arrow "=>". The last two are bogus but we
                 * include them because that's what the original implementation did.
                 */
                int separator = nextCleanInternal();
                if (separator != ':' && separator != '=') {
                    //throw syntaxError("Expected ':' after " + name);
            //      APaymentHelperDemo.toAndroidLog(tag, "Expected ':' after " + name);
                    return null;
                }
                if (pos < ins.Length && ins.Substring(pos,1).ToCharArray()[0] == '>') {
                    pos++;
                }
                result.put((string) name, nextValue());
    
                switch (nextCleanInternal()) {
                    case '}':
                        return result;
                    case ';':
                    case ',':
                        continue;
                    default:
                //        APaymentHelperDemo.toAndroidLog(tag, "Unterminated object");
                        return null;
                       // throw syntaxError("Unterminated object");
                }
            }
        }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子...
    你猜_19ca阅读 300评论 0 0
  • 秋高气爽,夜晚满天繁星,听着一首云淡风轻的歌,躺在芦苇草中,闭上眼睛,像往日一样安详,月亮渐渐隐去,我将幸福的停止...
    科洋阅读 94评论 0 0
  • 昨天,诺兰《敦刻尔克》首波评论出炉,果然爆了。 标题来源:时光网 什么汤姆·哈迪就10句台词,无以伦比的默片;大师...
    Sir电影阅读 1,158评论 0 11