用最少的代码来解决这个问题的一种可能方式是继承
JsonTextReader并重写
Value属性返回一个小写的字符串,只要当前
TokenType是
PropertyName:
public class LowerCasePropertyNameJsonReader : JsonTextReader{ public LowerCasePropertyNameJsonReader(TextReader textReader) : base(textReader) { } public override object Value { get { if (TokenType == JsonToken.PropertyName) return ((string)base.Value).ToLower(); return base.Value; } }}之所以可行,是因为底层
JsonTextReader在
TokenType内部状态变化时保持更新,并且序列化程序(实际上是
JsonSerializerInternalReader类)在通过
Value属性从读取器检索属性名称时依赖于此。
您可以创建一个简短的辅助方法,以方便使用自定义阅读器反序列化:
public static class JsonHelper{ public static JToken DeserializeWithLowerCasePropertyNames(string json) { using (TextReader textReader = new StringReader(json)) using (JsonReader jsonReader = new LowerCasePropertyNameJsonReader(textReader)) { JsonSerializer ser = new JsonSerializer(); return ser.Deserialize<JToken>(jsonReader); } }}然后在您的代码中,只需替换为:
JToken json = JToken.Parse(jsonString);
有了这个:
JToken json = JsonHelper.DeserializeWithLowerCasePropertyNames(jsonString);
小提琴:https :
//dotnetfiddle.net/A0S3I1



