Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# JSON.NET JObject密钥比较不区分大小写_C#_Json_Json.net - Fatal编程技术网

C# JSON.NET JObject密钥比较不区分大小写

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);

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

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建议进行了更新