I'm using the JsonExtensionData Attribute along with a Dictionary<string, object>, which actually works pretty well for all my "unknown" JSON results.
Unfortunately the JSON string I get from my webservice sometimes gives me keys with non-alphanumeric characters, which I want to cleanup during deserialization.
For example:
"dc:title":"My Document title"
During deserialization I want to remove all non-alphanumeric characters and I wonder if there is an easy way to do so with a custom converter?
Derserializer Code
public class TikaDeserializer : IDeserializer
{
private Newtonsoft.Json.JsonSerializer serializer;
public TikaDeserializer(Newtonsoft.Json.JsonSerializer serializer)
{
this.serializer = serializer;
}
public T Deserialize<T>(RestSharp.IRestResponse response)
{
var content = response.Content;
using(var stringReader = new StringReader(content))
{
using(var jsonTextReader = new JsonTextReader(stringReader))
{
return serializer.Deserialize<T>(jsonTextReader);
}
}
}
public string DateFormat { get; set; }
public string Namespace { get; set; }
public string RootElement { get; set; }
public static TikaDeserializer Default
{
get
{
return new TikaDeserializer(new Newtonsoft.Json.JsonSerializer()
{
NullValueHandling = NullValueHandling.Ignore,
});
}
}
Converter Code by Gediminas
public class InputKeyNameCleanerConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.IsGenericType && objectType.GetGenericTypeDefinition() == typeof(Dictionary<,>);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jObject = JToken.ReadFrom(reader);
foreach(JToken token in jObject.ToList())
{
string replacedName = Regex.Replace(token.Path, @"[^A-Za-z]", String.Empty);
JProperty newToken = new JProperty(replacedName, token.First);
token.Replace(newToken);
}
return jObject.ToObject(objectType);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotSupportedException();
}
}
Model
public class ParsedDocument
{
[JsonProperty("Author")]
public string Author { get; set; }
[JsonProperty("Content-Type")]
public string ContentType { get; set; }
[JsonProperty("Content-Encoding")]
public string ContentEncoding { get; set; }
[JsonProperty("Creation-Date")]
public DateTime? DateCreated { get; set; }
[JsonProperty("Last-Modified")]
public DateTime? DateModified { get; set; }
[JsonProperty("Last-Save-Date")]
public DateTime? DateSaved { get; set; }
[JsonProperty("Last-Printed")]
public DateTime? DatePrinted { get; set; }
[JsonProperty("title")]
public string Title { get; set; }
[JsonProperty("X-TIKA:content")]
public string Content { get; set; }
[JsonExtensionData]
public Dictionary<string, object> MetaData { get; set; }
}