JSON.NET e matrici che utilizzano LINQ
Domanda
Ho guardato questa Analizzare JSON usando Json.net e la risposta è vicino a ciò di cui ho bisogno. La differenza fondamentale è che ho bisogno di analizzare una matrice di coppie x, y che formano una o più righe per record. Ecco un esempio del mio contributo
{
"displayFieldName" : "FACILITYID",
"fieldAliases" : {
"FACILITYID" : "Facility Identifier",
},
"geometryType" : "esriGeometryPolyline",
"spatialReference" : {
"wkid" : 4326
},
"features" : [
{
"attributes" : {
"FACILITYID" : "",
"OBJECTID" : 1,
},
"geometry" :
{
"paths" :
[
[
[-80.3538239379999, 27.386884271],
[-80.3538100319999, 27.3868901900001],
[-80.3538157239999, 27.3869008510001]
]
]
}
},
{
"attributes" : {
"FACILITYID" : "",
"OBJECTID" : 2,
},
"geometry" :
{
"paths" :
[
[
[-80.3538239379999, 27.386884271],
[-80.3538295849999, 27.3868948420001]
]
]
}
}
]
}
(Controlla http: / /sampleserver1.arcgisonline.com/ArcGIS/rest/services/WaterTemplate/WaterDistributionNetwork/MapServer/9/query?outFields= * & amp; where = OBJECTID% 3C20 & amp; f = pjson per l'elenco completo)
Quello che devo fare è analizzare le matrici [" caratteristiche "] [" geometria "] [" percorsi "] in linee composte da coppie x, y. Ecco come ottengo tutti i percorsi (uno per "record" come nell'array delle funzionalità):
var allPaths = from p in jsonObject["features"].Children()["geometry"]
select p["paths"];
Questo mi dà i miei percorsi, da cui posso quindi elaborare ciascun array di punti a turno:
foreach (var eachPolylineInPath in allPaths)
{
IEnumerable<Point> linePoints = from line in eachPolylineInPath.Children()
select new Point(
(double) line[0],
(double) line[1],
double.NaN);
}
Ecco dove rimango bloccato. Sto provando vari cast dalle istruzioni JArray e LINQ-y, ma continuo a ottenere risultati nulli o non è possibile accedere a eccezioni alla sintonia dei valori figlio di JProperty.
Speriamo che qualcuno abbia già avuto a che fare con la conversione di array di array in JSON.NET usando LINQ e possa spiegare lo stupido errore che devo fare o l'ovvia risposta che non riesco a vedere.
Soluzione
Sembra che i percorsi siano una matrice di matrici di punti, quindi supponendo che si desideri un IEnumerable per ogni percorso, è necessario:
var allPaths = from p in jsonObject["features"].Children()["geometry"]
select p["paths"].Children();