JSON密钥的访问不区分大小写

iszxjhcz  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(228)

我正在尝试使用Newtonsoft库更新json(深度〉2)文件。在阅读文件时,如果json键的大小写与json文件中的不同,则无法获取其值。
示例JSON文件:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Error",
      "Microsoft.Hosting": "Error"
    }
  },
}

示例C#代码:

using (file)
            {
                var serializer = new JsonSerializer();
                var json = null;
                using (var streamReader = new StreamReader(file))
                {
                    using (var reader = new JsonTextReader(streamReader))
                    {
                        try
                        {
                            json = serializer.Deserialize(reader) as JObject;
                        }
                        catch (Exception e)
                        {

                        }
                    }
                }

现在,我尝试通过以下方式访问密钥:

json["Logging"]["LogLevel"]["microsoft"]

但是,它无法获取,因为“microsoft”键为小写,即与json文件中的大小写不同。我尝试在Web上搜索,但结果显示Newtonsoft lib默认情况下不区分大小写。但是,它似乎不适用于我的大小写。我是否缺少访问键的语法?请提供建议。

a2mppw5e

a2mppw5e1#

默认情况下,反序列化器不区分大小写。请参见以下示例:

var text = """
    { "sOmEthIng": "Hi, world!" }
    """;

Console.WriteLine(JsonConvert.DeserializeObject<Foo>(text).SoMetHing);

class Foo
{
    public string SoMetHing { get; set; }
}

但是在您的例子中,您使用Newtonsoft.Json.Linq...,其中一些方法是区分大小写的。例如,JObject.this[string propertyName]:

public JToken? this[string propertyName]
{
    get
    {
        JProperty? property = Property(propertyName, StringComparison.Ordinal);
        return property?.Value;
    }
}

这显式使用区分大小写的StringComparison.Ordinal
另一种方法是使用指定大小写敏感性的方法,如JObject.Property

var text = """"
        {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft": "Error",
          "Microsoft.Hosting": "Error"
        }
      },
    }
    """";

var root = JsonConvert.DeserializeObject(text) as JObject;

var logging = root.Property("logging", StringComparison.InvariantCultureIgnoreCase).Value as JObject;
var logLevel = logging.Property("loglevel", StringComparison.InvariantCultureIgnoreCase).Value as JObject;
var microsoft = (logLevel.Property("microsoft", StringComparison.InvariantCultureIgnoreCase).Value as JValue).Value as string;

Console.WriteLine(microsoft);

相关问题