将JSON解析为JToken时如何将所有键更改为小写
我有一个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
以上是 将JSON解析为JToken时如何将所有键更改为小写 的全部内容, 来源链接: utcz.com/qa/397640.html