将 JSON 解析为 JToken 时如何将所有键更改为小写
Posted
技术标签:
【中文标题】将 JSON 解析为 JToken 时如何将所有键更改为小写【英文标题】:How to change all keys to lowercase when parsing JSON to a JToken 【发布时间】:2017-04-13 02:10:13 【问题描述】:我有一个 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
验证将不区分大小写。
【问题讨论】:
JProperty 只有名称的 getter,所以我认为您在更改它时会遇到问题。 是的。我在想有一些方法可以自定义解析机制。类似于具有 reviver 参数 (developer.mozilla.org/en/docs/Web/javascript/Reference/…) 来编辑解析的 js 解析函数。我只是不确定如何在 json.net 中自定义。 如果您想创建自定义 Json 转换器,请查看此内容。我不知道它是否对您当前的情况有所帮助:***.com/questions/8030538/… 也许在加载 JSON 之后使用这个? Json.net rename properties. @Jim 你为什么删除你的答案?虽然它对我的情况没有帮助,但它可以帮助其他用户。 【参考方案1】:用最少的代码解决这个问题的一种可能方法是继承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 时如何将所有键更改为小写的主要内容,如果未能解决你的问题,请参考以下文章
从 JSON 检索项目时获取“无法将 Newtonsoft.Json.Linq.JObject 转换为 Newtonsoft.Json.Linq.JToken”
如何将 JSON 字符串转换为 C# IEnumerable<JToken>
无法将类型“newtonsoft.json.linq.jtoken”隐式转换为 newt“newtonsoft.json.linq.jvalue”