示例#1
0
        private static object objectParser(JSONParser.Context ctx, Type type)
        {
            JSONParser.forward(ctx);
            if (JSONParser.match(ctx, 'n'))
            {
                if (ctx.pos + 3 > ctx.src.Length)
                {
                    throw new JSONParser.UnexpectedEOFException(ctx);
                }
                if ((int)ctx.src[ctx.pos] != 117 || (int)ctx.src[ctx.pos + 1] != 108 || (int)ctx.src[ctx.pos + 2] != 108)
                {
                    throw new JSONParser.UnexpectedCharacterException(ctx);
                }
                ctx.pos += 3;
                return((object)null);
            }
            object obj = (object)null;

            if ((object)type != null)
            {
                obj = Activator.CreateInstance(type);
            }
            JSONParser.parseObject(ctx, obj);
            return(obj);
        }
示例#2
0
        private static object parseObjectArray(JSONParser.Context ctx, JSONParser.ParseElement <object> parser, Type type)
        {
            JSONParser.forward(ctx);
            if ((int)ctx.src[ctx.pos] != 91)
            {
                throw new JSONParser.InvalidCharacterException(ctx);
            }
            ++ctx.pos;
            int count = ctx.ab.Count;

            while (true)
            {
                JSONParser.forward(ctx);
                ctx.ab.Add(parser(ctx, type));
                JSONParser.forward(ctx);
                if ((int)ctx.src[ctx.pos] == 44)
                {
                    ++ctx.pos;
                }
                else
                {
                    break;
                }
            }
            if ((int)ctx.src[ctx.pos] != 93)
            {
                throw new JSONParser.UnexpectedCharacterException(ctx);
            }
            ++ctx.pos;
            Array array = (Array)null;

            if ((object)type != null)
            {
                array = Array.CreateInstance(type, ctx.ab.Count - count);
                for (int index = 0; index < array.Length; ++index)
                {
                    array.SetValue(ctx.ab[index + count], index);
                }
            }
            ctx.ab.RemoveRange(count, ctx.ab.Count - count);
            return((object)array);
        }
示例#3
0
        private static object parseValueArray <T>(JSONParser.Context ctx, JSONParser.ParseElement <T> parser)
        {
            JSONParser.forward(ctx);
            if ((int)ctx.src[ctx.pos] != 91)
            {
                throw new JSONParser.InvalidCharacterException(ctx);
            }
            ++ctx.pos;
            Type type  = typeof(T);
            int  count = ctx.ab.Count;

            while (true)
            {
                JSONParser.forward(ctx);
                ctx.ab.Add((object)parser(ctx, type));
                JSONParser.forward(ctx);
                if ((int)ctx.src[ctx.pos] == 44)
                {
                    ++ctx.pos;
                }
                else
                {
                    break;
                }
            }
            if ((int)ctx.src[ctx.pos] != 93)
            {
                throw new JSONParser.UnexpectedCharacterException(ctx);
            }
            ++ctx.pos;
            T[] objArray = new T[ctx.ab.Count - count];
            for (int index = 0; index < objArray.Length; ++index)
            {
                objArray[index] = (T)ctx.ab[index + count];
            }
            ctx.ab.RemoveRange(count, ctx.ab.Count - count);
            return((object)objArray);
        }
示例#4
0
        private static bool parseObject(JSONParser.Context ctx, object obj)
        {
            Type type = obj == null ? (Type)null : obj.GetType();

            JSONParser.forward(ctx);
            if (!JSONParser.match(ctx, '{'))
            {
                throw new JSONParser.UnexpectedCharacterException(ctx);
            }
            while (true)
            {
                JSONParser.forward(ctx);
                if (!JSONParser.match(ctx, '}'))
                {
                    if ((int)ctx.src[ctx.pos] == 34)
                    {
                        JSONParser.parseString(ctx);
                        if (ctx.sb.Length > 0)
                        {
                            JSONParser.forward(ctx);
                            if ((int)ctx.src[ctx.pos] == 58)
                            {
                                ++ctx.pos;
                                JSONParser.forward(ctx);
                                FieldInfo fieldInfo = (object)type == null ? (FieldInfo)null : type.GetField(ctx.sb.ToString());
                                if ((object)fieldInfo == null)
                                {
                                    if ((int)ctx.src[ctx.pos] == 34)
                                    {
                                        JSONParser.parseString(ctx);
                                    }
                                    else if ((int)ctx.src[ctx.pos] == 123)
                                    {
                                        JSONParser.parseObject(ctx, (object)null);
                                    }
                                    else if ((int)ctx.src[ctx.pos] == 91)
                                    {
                                        JSONParser.parseArray(ctx, (Type)null);
                                    }
                                    else if ((int)ctx.src[ctx.pos] == 45 || 48 <= (int)ctx.src[ctx.pos] && (int)ctx.src[ctx.pos] <= 57)
                                    {
                                        JSONParser.parseNumber(ctx, false);
                                    }
                                }
                                else
                                {
                                    Type fieldType = fieldInfo.FieldType;
                                    if (fieldType.IsValueType || (object)fieldType == (object)typeof(string))
                                    {
                                        if ((object)fieldType == (object)typeof(int))
                                        {
                                            JSONParser.parseNumber(ctx, true);
                                            fieldInfo.SetValue(obj, (object)int.Parse(ctx.sb.ToString()));
                                        }
                                        else if ((object)fieldType == (object)typeof(long))
                                        {
                                            JSONParser.parseNumber(ctx, true);
                                            fieldInfo.SetValue(obj, (object)long.Parse(ctx.sb.ToString()));
                                        }
                                        else if ((object)fieldType == (object)typeof(float))
                                        {
                                            JSONParser.parseNumber(ctx, false);
                                            fieldInfo.SetValue(obj, (object)float.Parse(ctx.sb.ToString()));
                                        }
                                        else if ((object)fieldType == (object)typeof(double))
                                        {
                                            JSONParser.parseNumber(ctx, false);
                                            fieldInfo.SetValue(obj, (object)double.Parse(ctx.sb.ToString()));
                                        }
                                        else if ((object)fieldType == (object)typeof(short))
                                        {
                                            JSONParser.parseNumber(ctx, true);
                                            fieldInfo.SetValue(obj, (object)short.Parse(ctx.sb.ToString()));
                                        }
                                        else if ((object)fieldType == (object)typeof(byte))
                                        {
                                            JSONParser.parseNumber(ctx, true);
                                            fieldInfo.SetValue(obj, (object)byte.Parse(ctx.sb.ToString()));
                                        }
                                        else if ((object)fieldType == (object)typeof(string))
                                        {
                                            JSONParser.parseString(ctx);
                                            fieldInfo.SetValue(obj, (object)ctx.sb.ToString());
                                        }
                                        else
                                        {
                                            goto label_33;
                                        }
                                    }
                                    else if (fieldType.IsArray)
                                    {
                                        if ((int)ctx.src[ctx.pos] == 91 && (int)ctx.src[ctx.pos + 1] == 93)
                                        {
                                            ctx.pos += 2;
                                        }
                                        else
                                        {
                                            Type   elementType = fieldType.GetElementType();
                                            object array       = JSONParser.parseArray(ctx, elementType);
                                            fieldInfo.SetValue(obj, array);
                                        }
                                    }
                                    else if ((int)ctx.src[ctx.pos] == 123 && (int)ctx.src[ctx.pos + 1] == 125)
                                    {
                                        ctx.pos += 2;
                                    }
                                    else
                                    {
                                        object obj1;
                                        if (JSONParser.match(ctx, 'n'))
                                        {
                                            if (ctx.pos + 3 <= ctx.src.Length)
                                            {
                                                if ((int)ctx.src[ctx.pos] == 117 && (int)ctx.src[ctx.pos + 1] == 108 && (int)ctx.src[ctx.pos + 2] == 108)
                                                {
                                                    ctx.pos += 3;
                                                    obj1     = (object)null;
                                                }
                                                else
                                                {
                                                    goto label_45;
                                                }
                                            }
                                            else
                                            {
                                                goto label_42;
                                            }
                                        }
                                        else
                                        {
                                            obj1 = Activator.CreateInstance(fieldType);
                                            JSONParser.parseObject(ctx, obj1);
                                        }
                                        fieldInfo.SetValue(obj, obj1);
                                    }
                                }
                                JSONParser.forward(ctx);
                                if ((int)ctx.src[ctx.pos] == 44)
                                {
                                    ++ctx.pos;
                                }
                                else
                                {
                                    goto label_50;
                                }
                            }
                            else
                            {
                                goto label_8;
                            }
                        }
                        else
                        {
                            goto label_6;
                        }
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    goto label_53;
                }
            }
            throw new JSONParser.UnexpectedCharacterException(ctx);
label_6:
            throw new JSONParser.InvalidKeyException(ctx);
label_8:
            throw new JSONParser.UnexpectedCharacterException(ctx);
label_33:
            throw new JSONParser.UnsupportedTypeException(ctx);
label_42:
            throw new JSONParser.UnexpectedEOFException(ctx);
label_45:
            throw new JSONParser.UnexpectedCharacterException(ctx);
label_50:
            if ((int)ctx.src[ctx.pos] != 125)
            {
                throw new JSONParser.InvalidCharacterException(ctx);
            }
            ++ctx.pos;
label_53:
            return(true);
        }