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.")))); }
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())); }
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); }
protected SimpleJsonParser(SimpleJsonParser <R> that, RuntimeSchema schema) : base(that, schema, flatten: true) { }