【发布时间】:2016-03-10 03:15:45
【问题描述】:
我正在使用JsonExtensionData 属性和Dictionary<string, object>,它实际上对我所有的“未知” JSON 结果都非常有效。
不幸的是,我从我的 web 服务获得的 JSON 字符串有时会给我带有非字母数字字符的键,我想在反序列化期间对其进行清理。
例如:
"dc:title":"My Document title"
在反序列化期间,我想删除所有非字母数字字符,我想知道是否有使用自定义转换器的简单方法?
反序列化代码
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,
});
}
}
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();
}
}
型号
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; }
}
【问题讨论】:
-
尝试像这样使用动态(动态数据 = deserialiseJson(JsonString);
标签: c# json.net deserialization