PickingSimpleAttributesfromHierarchicalJSON*虽然我的标题已经被其他用户编辑过,但我正在寻找一种从C#*使用JSON的方法。NET库的解决方案(包括伪代码)很棒!?我正在尝试使用JSON数据集提供的分层数据。我正在使用C#和JSON.NET。如果有帮助,我很乐意使用Linq,尤其是用于JSON.NET的Linq。否则,使用非LinqC#/JSON.NET就可以了。理想情况下,我试图优雅地完成两件事:我想提取表示每个分支的JSON和该分支自己的属性——而不是它的子(嵌套)分支对象(我将在稍后详细解释)。我想在创建分支对象时跟踪父节点。如需进一步考虑,请参阅以下JSON摘录:{"Branch1":{"Prop1A":"1A","Prop1B":"1B","Prop1C":"1C","Branch2":{"Prop2A":"2A","Prop2B":"2B","Prop2C":"2C","Branch3":{"Prop3A":"3A","Prop3B":"3B","Prop3C":"3C"}}}}与目标1(从上面)相关:鉴于JSON由嵌套的JSON对象组成,我只想选择每个分支的简单(字符串)属性。例如,我想提取仅包含Prop1A、Prop1B和Prop1C属性的Branch1的JSON。然后我想提取Branch2的JSON,它只包含Prop2A、Prop2B和Prop2C属性等。我意识到我可以将整个JSON表示为一个JSON.NETJToken对象,然后迭代它的Children()并只查找JTokenType.Property类型,但也许有一种更优雅的方法可以使用Linq快速选择属性类型。.?最后,我将拥有三个独立的JSON对象,如下所示:JSONObject1:{"Prop1A":"1A","Prop1B":"1B","Prop1C":"1C"}JSONObject2:{"Prop2A”:“2A”,“Prop2B”:“2B”,“Prop2C”:“2C”}JSON对象3:{“Prop3A”:“3A”,“Prop3B”:“3B”,“Prop3C”:“3C”"}与目标2(从上面)相关:理想情况下,上面提取的每个JSON也将有一个指示其父级的属性。所以最终的JSON对象看起来像这样:{"Prop1A":"1A","Prop1B":"1B","Prop1C":"1C","Parent":""}and:{"Prop2A":"2A","Prop2B":"2B","Prop2C":"2C","Parent":"Branch1"}and:{"Prop3A":"3A","Prop3B":"3B","Prop3C":"3C","Parent":"Branch2"}有什么想法吗?您可以使用JContainer.DescendantsAndSelf()查找JSON层次结构中的所有对象,然后针对每个对象循环遍历其属性并过滤掉值为JValue原语的对象。因此,以下查询创建一个包含您需要的属性名称和值的列表:varroot=(JContainer)JToken.Parse(jsonString);varquery1=fromoinroot.DescendantsAndSelf().OfType()//查找对象letl=o.Properties().Where(p=>p.ValueisJValue)//选择它们的原始属性wherel.Any()//跳过没有属性的对象selectnewJObject(l);//并返回一个JObjectvarlist1=query1.ToList();要始终跳过根对象,即使它具有原始属性,请使用JContainer.Descendants()。如果你真的只想要字符串值属性(而不是原始属性),你可以检查JToken.Type属性:letl=o.Properties().Where(p=>p.Value.Type==JTokenType.String)//Selecttheirstring-valuedproperties可以使用JToken.Ancestors增强查询以包含一个合成的“Parent”属性,该属性给出包含对象的直接父属性的名称:varquery2=fromoinroot.DescendantsAndSelf().OfType()//查找对象letl=o.Properties().Where(p=>p.ValueisJValue)//选择它们的原始属性wherel.Any()//跳过没有属性的对象//添加合成的“Parent"propertyletl2=l.Concat(new[]{newJProperty("Parent",o.Ancestors().OfType().Select(a=>a.Name).FirstOrDefault()??"")})选择新的JObject(l2);//并返回一个JObject.varlist2=query2.ToList();但是,在您想要的输出中,您似乎需要对象父级的属性名称,而不是对象的属性名称。如果是这样,您可以这样做:varquery3=fromoinroot.DescendantsAndSelf().OfType()//查找对象letl=o.Properties().Where(p=>p.ValueisJValue)//选择它们的原始属性l.Any()//跳过没有属性的对象//添加合成的“Parent”属性letl2=l.Concat(new[]{newJProperty("Parent",o.Ancestors().OfType().Skip(1).Select(a=>a.Name).FirstOrDefault()??"")})选择新的JObject(l2);//并返回一个JObject.varlist3=query3.ToList();对于最终查询,如果我这样做:Console.WriteLine(JsonConvert.SerializeObject(list3,Formatting.Indented));产生以下输出,显示JObject列表包含您需要的内容:[{"Prop1A":"1A","Prop1B":"1B","Prop1C":"1C","Parent":""},{"Prop2A":"2A","Prop2B":"2B","Prop2C":"2C","Parent":"Branch1"},{"Prop3A":"3A","Prop3B":"3B","Prop3C":"3C","Parent":"Branch2"}]注意,如果JSON对象本身有一个属性为"Parent",JObject的构造函数可能会抛出重复键异常。以上就是C#学习教程:SelectingsimpleattributesfromhierarchicalJSON的全部内容分享。如果对你有用,需要了解更多C#学习教程,希望大家多多关注——本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
