将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属性返回一个小写的字符串,只要当前TokenTypePropertyName

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;

}

}

}

之所以可行,是因为底层JsonTextReaderTokenType内部状态变化时保持更新,并且序列化程序(实际上是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

回到顶部