将 JSON 解析为 JToken 时如何将所有键更改为小写
How to change all keys to lowercase when parsing JSON to a JToken
我有一串JSON,key有大小写字符:
{"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
验证不区分大小写。
用最少的代码解决这个问题的一种可能方法是 class 子 JsonTextReader
并将 Value
属性 覆盖为 return 小写字符串每当当前 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
class)依赖于它它会通过 Value
属性.
从 reader 检索 属性 名称
您可以创建一个简短的辅助方法,以便使用自定义 reader:
轻松反序列化
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);
Fiddle: https://dotnetfiddle.net/A0S3I1
我有一串JSON,key有大小写字符:
{"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
验证不区分大小写。
用最少的代码解决这个问题的一种可能方法是 class 子 JsonTextReader
并将 Value
属性 覆盖为 return 小写字符串每当当前 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
class)依赖于它它会通过 Value
属性.
您可以创建一个简短的辅助方法,以便使用自定义 reader:
轻松反序列化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);
Fiddle: https://dotnetfiddle.net/A0S3I1