我有一串JSON,钥匙具有大写和小写字符:
{"employees":[
{"FIrstName":"John", "LASTname":"Doe"},
{"FIRSTNAME":"Anna", "LaSTNaME":"Smith"},
{"firstName":"Peter", "lastName":"Jones"}
]}
我想将其转换为JToken
对象,并在JToken
中使用所有键。因此,在JToken
中,应该如下:
{"employees":[
{"firstname":"John", "lastname":"Doe"},
{"firstname":"Anna", "lastname":"Smith"},
{"firstname":"Peter", "lastname":"Jones"}
]}
以前我正在使用JToken json = JToken.Parse(jsonString);
进行转换,但是我找不到如何使钥匙小写。有任何想法?
我需要这样做的原因是我的JsonSchema
验证将是不敏感的。
用最小代码解决此问题的一种可能方法是子类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