Ich nehme an, dies ist ein weiterer Eintrag in meiner Reihe von Fragen, aber ich bin wieder fest. Dieses Mal, ich habe Probleme, die Arbeit mit einem JArray von JObjects und für jedes Element den Property.Value Typs Bestimmung in den JArray ...Abfrage und Filterung von JObjects mit Linq
Mein Code ist hier: https://dotnetfiddle.net/bRcSAQ
Der Unterschied zwischen meinem vorherigen Fragen und diese Frage ist, dass meine äußere Linq Abfrage beide JObject und JArray Token erhält, ist also, warum ich eine if (jo is JObject)
bei Zeile 40 und eine if (jo is JArray)
bei Line 48.
Sobald ich weiß, ich habe eine JArray von <JObjects>
, ich habe Code, der so aussieht (Zeilen 48-):
if (jo is JArray)
{
var items = jo.Children<JObject>();
// return a JObject object
}
Wenn ich einen Debugger verwende und Objekte betrachte, sehe ich, dass es 3 JObject-Objekte enthält - eines für Item_3A1, Item_3A2 und Item3A3. Aber ich muss den JTokenType für jeden JProperty.Value wissen, da ich nur an Property-Werten vom Typ JTokenType.String interessiert bin.
Also habe ich versucht:
// doesn't work :(
var items = jo.Children<JObject>()
.Where(p => p.Value.Type == JTokenType.String);
Der Compiler roten Linien die Value-Eigenschaft mit dem Fehler CS0119 'JToken.Value<T>(object)' is a method, which is not valid in the given context.
Ich stelle fest, dass "p" in der Linq ausdrücklich kein JProperty ist. Ich denke, es ist ein JObject. Und ich weiß nicht, wie man "p" ausgibt, damit ich den Typ des JProperty-Objekts, das es repräsentiert, untersuchen kann.
Letztendlich brauche ich den Code für die JArray-Verarbeitung (ab Zeile 48), um ein JObject zurückzugeben, das ein JSON-Array enthält, das nur aus JProperty-Objekten vom Typ JTokenType.String besteht. Dies bedeutet, dass die Probe JSON gegeben, es zuerst eine JObject hält diese JSON Eigenschaften zurückgeben sollte:
{ ""Item_3A1"": ""Desc_3A1"" },
{ ""Item_3A2"": ""Desc_3A2"" },
{ ""Item_3A3"": ""Desc_3A3"" }
Auf der nächsten Iteration, sollte es eine JObject halten diese JSON Eigenschaften zurückkehren (Beachten Sie, dass die verschachtelten Array3B1 Eigenschaften wegen weggelassen Array3B1 ist kein JProperty mit einem Werttyp von JTokenType.String):
{ ""Item_3B1"": ""Desc_3B1"" },
{ ""Item_3B2"": ""Desc_3B2"" },
Die dritte Iteration enthalten würde:
{ ""Item_3B11"": ""Desc_3B11"" },
{ ""Item_3B12"": ""Desc_3B12"" },
{ ""Item_3B13"": ""Desc_3B13"" }
Und die vierte (letzte) Iteration würde enthalten:
Dies könnte meine letzte Hürde in dieser "Serie" sein.
Ein herzliches Dankeschön an alle, die helfen können und werden - und ein besonderer Dank nochmal an die Benutzer "Brian Rogers" und "dbc" für ihr wirklich erstaunliches JSON.NET/Linq-Wissen.
Haben Sie versucht, p.Value zu machen. GetType()? –
Ja, aber das hat nicht geholfen. Der Schlüssel war, SelectMany() zu verwenden und ein Where() an das Ende dieses Resultsets anzuheften. – Jazimov