在解析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;
        }
    }
}

这起作用是因为基础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

相关内容

  • 没有找到相关文章

最新更新