Raf*_*afi 6 c# json json.net jsonschema json-deserialization
我有一个JSON字符串,键有大写和小写字符:
{"employees":[
{"FIrstName":"John", "LASTname":"Doe"},
{"FIRSTNAME":"Anna", "LaSTNaME":"Smith"},
{"firstName":"Peter", "lastName":"Jones"}
]}
Run Code Online (Sandbox Code Playgroud)
我想将它转换为一个JToken对象,并将所有键都设置JToken为小写.所以内部JToken应该如下:
{"employees":[
{"firstname":"John", "lastname":"Doe"},
{"firstname":"Anna", "lastname":"Smith"},
{"firstname":"Peter", "lastname":"Jones"}
]}
Run Code Online (Sandbox Code Playgroud)
以前我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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为底层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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后在你的代码中,只需替换它:
JToken json = JToken.Parse(jsonString);
Run Code Online (Sandbox Code Playgroud)
有了这个:
JToken json = JsonHelper.DeserializeWithLowerCasePropertyNames(jsonString);
Run Code Online (Sandbox Code Playgroud)
小提琴:https://dotnetfiddle.net/A0S3I1
| 归档时间: |
|
| 查看次数: |
1625 次 |
| 最近记录: |