/// <summary> /// </summary> /// <param name="baseType">The property type that is get or set (aka the assignable type).</param> internal ConfigTypeJsonConverter(Type baseType) //, JsonSerializer innerSerializer) { Contract.Requires <ArgumentNullException>(baseType != null); //Contract.Requires<ArgumentNullException>(innerSerializer != null); //_innerSerializer = innerSerializer; _baseType = baseType; // Determine possible types _possibleTypes = LogJamConfigTypes.GetConcreteTypesFor(baseType).ToArray(); // Create property name => types Lookup _typesWithProperty = _possibleTypes.SelectMany(type => type.GetProperties().Select(property => new { type, property })) .ToLookup(a => a.property.Name, a => a.type); // Create TypeHint -> type lookup _typesWithTypeHint = _possibleTypes.SelectMany(type => JsonTypeHintAttribute.For(type).Select(jsonHint => new { jsonHint, type })) .ToLookup(a => a.jsonHint, a => a.type); // Create list of TypeHint properties _typeHintProperties = new HashSet <string>(_typesWithTypeHint.Select(grouping => grouping.Key.Property), StringComparer.OrdinalIgnoreCase); }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var jsonTypeHint = JsonTypeHintAttribute.For(value.GetType()).FirstOrDefault(); //JToken token; //using (JTokenWriter jTokenWriter = new JTokenWriter()) //{ // serializer.Serialize(jTokenWriter, value); // token = jTokenWriter.Token; //} //using (JTokenReader jTokenReader = new JTokenReader(token)) //{ // if (jsonTypeHint != null) // { // JObject jo = JObject.FromObject(value); // jo.AddFirst(new JProperty(jsonTypeHint.Property, jsonTypeHint.Value)); // writer.WriteToken(jo.CreateReader()); // } // else // { // writer.WriteToken(jTokenReader); // } //} JObject jo = JObject.FromObject(value); if (jsonTypeHint != null) { jo.AddFirst(new JProperty(jsonTypeHint.Property, jsonTypeHint.Value)); } writer.WriteToken(jo.CreateReader()); }