JSON.NET JObject键比较不区分大小写

Jef*_*rey 31 c# json json.net

我正在使用Newtonsoft Json.net来解析JSON字符串.我将字符串转换为JObject.当通过键访问元素的值时,我希望比较是不区分大小写的.在下面的代码中,我使用"FROM"作为键.我希望它在行json ["FROM"]返回字符串"1".ToString().但它失败了.是否可以使下面的代码工作?

String ptString = "{from: 1, to: 3}";
var json = (JObject)JsonConvert.DeserializeObject(ptString);

String f = json["FROM"].ToString();
Run Code Online (Sandbox Code Playgroud)

Gia*_*rdi 93

这应该工作:

string json = @"{UPPER: 'value'}";
JObject o = JObject.Parse(json);
var value = o.GetValue("upper", StringComparison.OrdinalIgnoreCase)?.Value<string>();
Run Code Online (Sandbox Code Playgroud)

  • 我使用了这个答案并略微改为:var value = o.GetValue("upper",StringComparison.OrdinalIgnoreCase)?. Value <string>(); 当键不在json中时处理null引用异常. (7认同)
  • 同样的事情似乎不适用于SelectToken方法. (3认同)
  • 根据 @CaseyO'Brien 建议更新片段 (2认同)

For*_*ntr 10

c#允许你使用不区分大小写的键的字典,所以我使用的解决方法是将JObject转换为带有StringComparer.CurrentCultureIgnoreCaseset 的字典,如下所示:

JObject json = (JObject)JsonConvert.DeserializeObject(ptString);
Dictionary<string, object> d = new Dictionary<string, object>(json.ToObject<IDictionary<string, object>>(), StringComparer.CurrentCultureIgnoreCase);

String f = d["FROM"].ToString();
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的缺点是你失去了获得"1级"以下任何东西的能力,这意味着你无法获得任何嵌套属性. (8认同)
  • 我建议改用这个: var Dictionary = new Dictionary&lt;string, JToken&gt;(jo.ToObject&lt;IDictionary&lt;string, JToken&gt;&gt;(), StringComparer.CurrentCultureIgnoreCase) 因为它允许在 .ToObject&lt;T&gt; 上使用返回值,与答案不同。 (2认同)