/// <summary> /// Parses the given JSON object to create a Protocol object /// </summary> /// <param name="jtok">JSON object</param> /// <returns>Protocol object</returns> private static Protocol Parse(JToken jtok) { string name = JsonHelper.GetRequiredString(jtok, "protocol"); string space = JsonHelper.GetOptionalString(jtok, "namespace"); string doc = JsonHelper.GetOptionalString(jtok, "doc"); var names = new SchemaNames(); JToken jtypes = jtok["types"]; var types = new List <Schema>(); if (jtypes is JArray) { foreach (JToken jtype in jtypes) { var schema = Schema.ParseJson(jtype, names, space); types.Add(schema); } } var messages = new Dictionary <string, Message>(); JToken jmessages = jtok["messages"]; if (null != jmessages) { foreach (JProperty jmessage in jmessages) { var message = Message.Parse(jmessage, names, space); messages.Add(message.Name, message); } } return(new Protocol(name, space, doc, types, messages)); }
/// <summary> /// Creates a new field for the record /// </summary> /// <param name="jfield">JSON object for the field</param> /// <param name="pos">position number of the field</param> /// <param name="names">list of named schemas already read</param> /// <param name="encspace">enclosing namespace of the records schema</param> /// <returns>new Field object</returns> private static Field createField(JToken jfield, int pos, SchemaNames names, string encspace) { var name = JsonHelper.GetRequiredString(jfield, "name"); var doc = JsonHelper.GetOptionalString(jfield, "doc"); var jorder = JsonHelper.GetOptionalString(jfield, "order"); Field.SortOrder sortorder = Field.SortOrder.ignore; if (null != jorder) { sortorder = (Field.SortOrder)Enum.Parse(typeof(Field.SortOrder), jorder); } var aliases = Field.GetAliases(jfield); var props = Schema.GetProperties(jfield); var defaultValue = jfield["default"]; JToken jtype = jfield["type"]; if (null == jtype) { throw new SchemaParseException($"'type' was not found for field: name at '{jfield.Path}'"); } var schema = Schema.ParseJson(jtype, names, encspace); return(new Field(schema, name, aliases, pos, doc, defaultValue, sortorder, props)); }
/// <summary> /// Parses the messages section of a protocol definition /// </summary> /// <param name="jmessage">messages JSON object</param> /// <param name="names">list of parsed names</param> /// <param name="encspace">enclosing namespace</param> /// <returns></returns> internal static Message Parse(JProperty jmessage, SchemaNames names, string encspace) { string name = jmessage.Name; string doc = JsonHelper.GetOptionalString(jmessage.Value, "doc"); bool? oneway = JsonHelper.GetOptionalBoolean(jmessage.Value, "one-way"); PropertyMap props = Schema.GetProperties(jmessage.Value); RecordSchema schema = RecordSchema.NewInstance(Schema.Type.Record, jmessage.Value as JObject, props, names, encspace); JToken jresponse = jmessage.Value["response"]; var response = Schema.ParseJson(jresponse, names, encspace); JToken jerrors = jmessage.Value["errors"]; UnionSchema uerrorSchema = null; if (null != jerrors) { Schema errorSchema = Schema.ParseJson(jerrors, names, encspace); if (!(errorSchema is UnionSchema)) { throw new AvroException(""); } uerrorSchema = errorSchema as UnionSchema; } return(new Message(name, doc, schema, response, uerrorSchema, oneway)); }
/// <summary> /// Static function to return instance of the union schema /// </summary> /// <param name="jarr">JSON object for the union schema</param> /// <param name="names">list of named schemas already read</param> /// <param name="encspace">enclosing namespace of the schema</param> /// <returns>new UnionSchema object</returns> internal static UnionSchema NewInstance(JArray jarr, PropertyMap props, SchemaNames names, string encspace) { List <Schema> schemas = new List <Schema>(); IDictionary <string, string> uniqueSchemas = new Dictionary <string, string>(); foreach (JToken jvalue in jarr) { Schema unionType = Schema.ParseJson(jvalue, names, encspace); if (null == unionType) { throw new SchemaParseException("Invalid JSON in union" + jvalue.ToString()); } string name = unionType.Fullname; if (uniqueSchemas.ContainsKey(name)) { throw new SchemaParseException("Duplicate type in union: " + name); } uniqueSchemas.Add(name, name); schemas.Add(unionType); } return(new UnionSchema(schemas, props)); }
internal static LogicalSchema NewInstance(JToken jtok, PropertyMap props, SchemaNames names, string encspace) { JToken jtype = jtok["type"]; if (null == jtype) { throw new AvroTypeException("Logical Type does not have 'type'"); } return(new LogicalSchema(Schema.ParseJson(jtype, names, encspace), JsonHelper.GetRequiredString(jtok, "logicalType"), props)); }
/// <summary> /// Static class to return a new instance of ArraySchema /// </summary> /// <param name="jtok">JSON object for the array schema</param> /// <param name="names">list of named schemas already parsed</param> /// <param name="encspace">enclosing namespace for the array schema</param> /// <returns></returns> internal static ArraySchema NewInstance(JToken jtok, PropertyMap props, SchemaNames names, string encspace) { JToken jitem = jtok["items"]; if (null == jitem) { throw new AvroTypeException("Array does not have 'items'"); } return(new ArraySchema(Schema.ParseJson(jitem, names, encspace), props)); }
/// <summary> /// Static function to return new instance of map schema /// </summary> /// <param name="jtok">JSON object for the map schema</param> /// <param name="props">dictionary that provides access to custom properties</param> /// <param name="names">list of named schemas already read</param> /// <param name="encspace">enclosing namespace of the map schema</param> /// <returns></returns> internal static MapSchema NewInstance(JToken jtok, PropertyMap props, SchemaNames names, string encspace) { JToken jvalue = jtok["values"]; if (null == jvalue) { throw new AvroTypeException("Map does not have 'values'"); } return(new MapSchema(Schema.ParseJson(jvalue, names, encspace), props)); }