C# JSON.NET JObject密钥比较不区分大小写
我正在使用Newtonsoft Json.net解析Json字符串。我将字符串转换为JObject。当通过键访问元素的值时,我希望比较不区分大小写。在下面的代码中,我使用“FROM”作为键。我希望它在json[“FROM”].ToString()行返回字符串“1”。但它失败了。有可能使下面的代码工作吗C# JSON.NET JObject密钥比较不区分大小写,c#,json,json.net,C#,Json,Json.net,我正在使用Newtonsoft Json.net解析Json字符串。我将字符串转换为JObject。当通过键访问元素的值时,我希望比较不区分大小写。在下面的代码中,我使用“FROM”作为键。我希望它在json[“FROM”].ToString()行返回字符串“1”。但它失败了。有可能使下面的代码工作吗 String ptString = "{from: 1, to: 3}"; var json = (JObject)JsonConvert.DeserializeObject(ptString);
String ptString = "{from: 1, to: 3}";
var json = (JObject)JsonConvert.DeserializeObject(ptString);
String f = json["FROM"].ToString();
c#允许您使用带有不区分大小写键的字典,因此我使用的一种解决方法是将JObject转换为带有StringComparer.CurrentCultureIgnorCase
set的字典,如下所示:
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();
JObject json=(JObject)JsonConvert.DeserializeObject(ptString);
Dictionary d=新字典(json.ToObject(),StringComparer.CurrentCultureInoRecase);
字符串f=d[“FROM”].ToString();
这应该可以:
var json=@“{UPPER:'value'}”;
var jObj=JObject.Parse(json);
var upper=jObj.GetValue(“upper”,StringComparison.OrdinalIgnoreCase)?.Value();
控制台。写入线(上);//价值
根据JSON-RPC规范(键是区分大小写的),这是被通缉的。你不能用Toupor或ToWar在其中一个末端创建逻辑吗?你真的应该考虑更新已被接受的答案给最上面的一个:这个方法的缺点是你失去了在“1级”下面得到任何东西的能力。这意味着你不能得到任何嵌套属性。我不认为有这么多的缺点。除非您不使用Azure API或自动生成的Swagger JSON,否则深度应该不会有什么问题。所有这些都经过计算,并创建类以正确的顺序处理嵌套。根据对象的不同,这会增加一些开销,但总的来说,我发现这非常有用。在我的例子中,Web客户端创建的文档更改了它们的属性框。。。再一次。由于它们不遵守自己的“约定”,类似这样的内容可以防止我每次都必须返回并修复代码。我建议改为使用:var dictionary=new dictionary(jo.ToObject(),StringComparer.CurrentCultureIgnoreCase),因为它允许在返回值上使用.ToObject,与答案不同。SelectToken方法似乎没有相同的功能。是的,我必须手动获取JToken,忽略大小写,然后找到它的父名称,以便在忽略属性名称大小写的情况下设置属性。我使用了这个答案,并稍微修改为:var value=o.GetValue(“upper”,StringComparison.OrdinalingOreCase)?.值();要处理键不在json中时的空引用异常。@CaseyO'Brien完全正确,我也遵循了该路线。这是对所述问题的最佳解决方案。根据@CaseyO'Brien建议进行了更新