예제 #1
0
        public override Expression Container(BondDataType?expectedType, ContainerHandler handler)
        {
            var parser      = new SimpleJsonParser <R>(this, Schema.GetElementSchema());
            var elementType = Expression.Constant(Schema.TypeDef.element.id);

            // if the json contains null instead of an array, simulate an empty list to deserialize a null value
            // into a nullable
            var readJsonNullAsEmptyList = Expression.Block(
                Reader.Read(),
                handler(parser, elementType, Expression.Constant(false), Expression.Constant(0), null));

            // if the json contains an array, read the array into the list
            var readJsonArrayAsList = Expression.Block(
                Reader.Read(),
                handler(parser, elementType, JsonTokenNotEquals(JsonToken.EndArray), Expression.Constant(0), null),
                Reader.Read());

            return(Expression.IfThenElse(
                       JsonTokenEquals(JsonToken.Null),
                       readJsonNullAsEmptyList,
                       Expression.IfThenElse(
                           JsonTokenEquals(JsonToken.StartArray),
                           readJsonArrayAsList,
                           ThrowUnexpectedInput("Expected JSON array or null."))));
        }
예제 #2
0
        public override Expression Map(BondDataType?expectedKeyType, BondDataType?expectedValueType, MapHandler handler)
        {
            var keyParser   = new SimpleJsonParser <R>(this, Schema.GetKeySchema());
            var valueParser = new SimpleJsonParser <R>(this, Schema.GetElementSchema());
            var keyType     = Expression.Constant(Schema.TypeDef.key.id);
            var valueType   = Expression.Constant(Schema.TypeDef.element.id);

            var next = JsonTokenNotEquals(JsonToken.EndArray);

            return(Expression.Block(
                       Reader.Read(),
                       handler(keyParser, valueParser, keyType, valueType, next, next, Expression.Constant(0)),
                       Reader.Read()));
        }
예제 #3
0
        Expression ProcessField(ParameterExpression requiredFields, IEnumerable <TransformSchemaPair> transforms)
        {
            // unknown fields are skipped (read past the unknown PropertyName then skip the value)
            Expression body = Expression.Block(
                Reader.Read(),
                SkipValue());

            var requiredIndex = 0;

            foreach (var pair in transforms)
            {
                var currentSchema    = pair.Schema;
                var currentTransform = pair.Transform;

                var structDef = currentSchema.StructDef;
                var index     = 0;

                foreach (var field in currentTransform.Fields)
                {
                    var fieldDef = structDef.fields[index++];
                    Debug.Assert(field.Id == fieldDef.id);

                    var parser = new SimpleJsonParser <R>(this, currentSchema.GetFieldSchema(fieldDef));

                    // chain ifs on field name to handle the value on the right field handler
                    var handleField = field.Value(parser, Expression.Constant(fieldDef.type.id));

                    if (fieldDef.metadata.modifier == Modifier.Required)
                    {
                        handleField = Expression.Block(RequiredFields.Mark(requiredFields, requiredIndex++), handleField);
                    }

                    string name;
                    body = Expression.IfThenElse(
                        PropertyNameEquals(fieldDef.metadata.attributes.TryGetValue(
                                               SimpleJsonWriter.NameAttribute, out name) ? name : fieldDef.metadata.name),
                        Expression.Block(Read(), handleField),
                        body);
                }
            }

            return(body);
        }
예제 #4
0
 protected SimpleJsonParser(SimpleJsonParser <R> that, RuntimeSchema schema)
     : base(that, schema, flatten: true)
 {
 }