Ejemplo n.º 1
0
        /// <summary>读取一个Json对象值</summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private SimpleJson ReadObject(JsonAtomStringReader reader)
        {
            var  d          = new Dictionary <string, SimpleJson>();
            bool isContinue = true;

            do
            {
                var k = Read(reader);
                if (k == null)
                {
                    break;
                }
                else if (k.IsUndefined || k.IsUnknown)
                {
                    if (k.Value != null && k.Value.ToString() == ",")
                    {
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }

                var split = Read(reader);
                if (split == null)
                {
                    break;
                }
                else if (split.IsUndefined || split.IsUnknown)
                {
                    if (split.Value != null && split.Value.ToString() == ":")
                    {
                        // 继续执行下面的
                    }
                    else
                    {
                        break;
                    }
                }

                var v = Read(reader);
                if (v == null)
                {
                    v = Undefined();
                }
                else if (v.IsUndefined || v.IsUnknown)
                {
                    isContinue = false;
                }
                d.Add(k.Value.ToString(), v);
            } while (isContinue);
            return(new SimpleJson()
            {
                Type = SimpleJsonType.Object,
                Value = d
            });
        }
Ejemplo n.º 2
0
        /// <summary>读取一个数组值</summary>
        /// <returns></returns>
        private SimpleJson ReadArray(JsonAtomStringReader reader)
        {
            var  d        = new List <SimpleJson>();
            bool hasSplit = true;

            do
            {
                var v = Read(reader);
                if (v == null)
                {
                    break;
                }
                else if (v.IsUndefined || v.IsUnknown)
                {
                    if (v.Value != null && v.Value.ToString() == ",")
                    {
                        if (hasSplit)
                        {
                            v = Undefined();
                        }
                        else
                        {
                            hasSplit = true;
                            continue;
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    hasSplit = false;
                }
                d.Add(v);
            } while (true);
            return(new SimpleJson()
            {
                Type = SimpleJsonType.Array,
                Value = d
            });
        }
Ejemplo n.º 3
0
        /// <summary>从指定文本读取流读出Json值</summary>
        /// <param name="r"></param>
        /// <returns></returns>
        public SimpleJson From(TextReader r)
        {
            var reader = new JsonAtomStringReader(r);

            reader.SingleQuotesString = true;
            if (BeginFromJson != null)
            {
                var e = new EventArgs <JsonAtomStringReader>(reader);
                BeginFromJson(this, e);
                reader = e.Arg;
            }
            var ret = Read(reader);

            if (EndFromJson != null)
            {
                var e = new EventArgs <JsonAtomStringReader, SimpleJson>(reader, ret);
                EndFromJson(this, e);
                ret = e.Arg2;
            }
            return(ret);
        }
Ejemplo n.º 4
0
        /// <summary>从指定Json原子元素读取流读出一个Json值,包括对象和数组</summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private SimpleJson Read(JsonAtomStringReader reader)
        {
            SimpleJson ret = null;
            string     str;
            var        t       = reader.Read(false, out str);
            var        retType = SimpleJsonType.Unknown;

            switch (t)
            {
            case JsonAtomType.NONE:
                break;

            case JsonAtomType.BRACE_OPEN:
                ret = ReadObject(reader);
                break;

            case JsonAtomType.BRACKET_OPEN:
                ret = ReadArray(reader);
                break;

            case JsonAtomType.TRUE:
            case JsonAtomType.FALSE:
                ret = Boolean(t == JsonAtomType.TRUE);
                break;

            case JsonAtomType.NULL:
                ret = Null();
                break;

            case JsonAtomType.NUMBER:
            case JsonAtomType.NUMBER_EXP:
                ret = ParseInteger(str);
                break;

            case JsonAtomType.FLOAT:
            case JsonAtomType.FLOAT_EXP:
                ret = ParseFloat(str);
                break;

            case JsonAtomType.STRING:
                retType = SimpleJsonType.String;
                goto default;

            case JsonAtomType.LITERAL:
                retType = SimpleJsonType.Literal;
                goto default;

            case JsonAtomType.BRACE_CLOSE:
            case JsonAtomType.BRACKET_CLOSE:
            case JsonAtomType.COMMA:
                retType = SimpleJsonType.Undefined;
                goto default;

            case JsonAtomType.COLON:
            default:
                ret = new SimpleJson()
                {
                    Type  = retType,
                    Value = str
                };
                break;
            }
            if (ret != null)
            {
                if (FromJson != null)
                {
                    var e = new EventArgs <JsonAtomStringReader, SimpleJson, JsonAtomType>(reader, ret, t);
                    FromJson(this, e);
                    ret = e.Arg2;
                }
            }
            return(ret);
        }