当前位置: 首页 > 编程语言 > C#

JSON.NET – 选择所有对象分享

时间:2023-04-11 03:22:36 C#

C#学习教程:JSON.NET-选择所有对象简而言之,如果我有以下JSON:{"someCar":{"id":"3","model":"M7","engine":"FIV8",},"name":"carparkone","id":"1","cars":[{"id":"1","model":"s60","engine":"i5",},{"id":"2",“模型”:“m3”,“引擎”:“FIV6”,},{“id”:“3”,“模型”:“M7”,“引擎”:“FIV8”,}]}我会的运行一些命令以获取其中所有对象的数组,即{}块内的任何对象。理想情况下,我会找到具有某些值的someProp的所有对象,因此只有具有值V6的属性引擎对象。tl;dr问题:如何获取嵌套在JObject中的所有对象的列表?(奖励)仅获取具有特定属性的对象。当没有预定义架构时,您可以使用LINQtoJSON来解析和筛选JSON对象。首先,使用JToken.Parse()将JSON解析为JObject。然后,您可以使用JContainer.DescendantsAndSelf()按文档顺序迭代该根对象及其所有后代标记。(或者如果您想跳过根对象,请使用JContainer.Descendants()。)然后你可以使用.OfType()来过滤所有对象,无论嵌套与否:过滤,可以添加一个额外的Where()子句,如下面的扩展方法所示:);varsomeValueToken=JToken.FromObject(someValue);varobjs=root.DescendantsAndSelf().OfType().Where(t=>comparer.Equals(t[someProp],someValueToken)).ToArray();returnobjs;然后执行:varfilteredObjs=root.FilterObjects(someProp,someValue);为了使FilterObjects()完全通用,我将所需值序列化为JToken,然后使用JTokenEqualityComparer将实际值与所需值进行比较。如果你知道你想要的值是原始类型,你可以这样做:publicstaticpartialclassJTokenExtensions{publicstaticboolIsNull(thisJTokentoken){returntoken==null||token.Type==JTokenType.Null;}publicstaticJObject[]FilterObjectsSimple(thisJObjectroot,stringsomeProp,TsomeValue){varcomparer=EqualityComparer.Default;varobjs=root.DescendantsAndSelf().OfType().Where(t=>{varv=t[someProp];returnv!=null&&(someValue==null?v.IsNull():comparer.Equals(v.ToObject(),someValue));}).ToArray();返回对象;示例小提琴。注意-您还可以考虑使用支持JSONPath查询语法的SelectTokens(),例如:varsomeProp="id";varsomeValue="3";varfilterString=string.Format(@"..*[?(@.{0}=='{1}')]",someProp,someValue);varfilteredObjs=root.SelectTokens(filterString).ToArray();但是,您的JSON包含直接嵌套在其他对象中的对象,而Newtonsoft的JSONPath实现无法找到此类直接嵌套的对象,如JSONPath脚本未正确实现对象#1256中所述。您可以像这样对数据建模:publicclassCarpark{[JsonProperty(PropertyName="name")]publicstringName{get;放;}[JsonProperty(PropertyName="id")]publicintId{get;设置;}[JsonProperty(PropertyName="cars")]publicIEnumerableCars{get;放;}}publicclassCar{[JsonProperty(PropertyName="id")]publicintId{get;放;}[JsonProperty(PropertyName="model")]publicstringModel{get;放;}[JsonProperty(PropertyName="engine")]publicstringEngine{get;放;然后使用该模型使用Json.Net反序列化您的字符串。以上就是C#学习教程:JSON.NET——选取所有对象共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——varcarpark=JsonConvert.DeserializeObject(myJsonString);foreach(varcarincarpark.Cars.Where(c=>c.Engine.ToLower().Contains("v6"))Console.WriteLine(car.Model);本文收集自网络,不代表位置,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处: