Ich versuche, einige JSON-Inhalt in C# zu analysieren. Für die einfacheren Fälle bin ich sehr erfolgreich mit JSON.NET und schätze den sauberen Ansatz des LINQ-Anbieters. Hier ist ein Beispiel, wo ich Informationen über eine Schicht in einer Karte bin Download und in einigen Eigenschaften einer Klasse Füllung genannt Schicht (suprisingly!):LINQ und JSON.NET, wenn die Eigenschaftsnamen variieren
using (var client = new WebClient())
{
_content = client.DownloadString(_url.AbsoluteUri + OutputFormats.Json);
}
JObject json = JObject.Parse(_content);
IEnumerable<Field> fields = from f in json["fields"].Children()
select new Field(
(string)f["name"],
(string)f["alias"],
(EsriFieldType)Enum.Parse(typeof(EsriFieldType), (string)f["type"])
);
_fields = fields.ToList();
_displayFieldName = (string)json["displayField"];
Sie an dieser URL für Details des JSON für die aussehen können Methode: http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/WaterTemplate/WaterDistributionNetwork/MapServer/1?f=json&pretty=true. Das Problem tritt jedoch auf, wenn ich die einzelnen Datenfelder, die mit Kartenebenen verknüpft sind, in eine DataTable oder sogar nur in eine Dictionary-Struktur umwandeln muss. Das Problem besteht darin, dass sich die Feldnamen und die Anzahl der Felder im Gegensatz zu RSS-Feeds oder anderen konsistenten Formaten von Kartenebene zu Kartenebene ändern. Hier ist ein Beispiel von mir eine Abfrage ausgeführt wird:
[Test]
[Category(Online)]
public void Can_query_a_single_feature_by_id()
{
var layer = _map.LayersWithName(ObjectMother.LayerWithoutOID)[0];
layer.FindFeatureById("13141");
Assert.IsNotNull(layer.QueryResults);
}
Der Code, der in layer.FindFeatureById laufen gelassen ist dies und schließt den Teil, wo ich stecken:
public void FindFeatureById(string id)
{
var queryThis = ObjectIdField() ?? DisplayField();
var queryUrl = string.Format("/query{0}&outFields=*&where=", OutputFormats.Json);
var whereClause = queryThis.DataType == typeof(string)
? string.Format("{0}='{1}'", queryThis.Name, id)
: string.Format("{0}={1}", queryThis.Name, id);
var where = queryUrl + HttpUtility.UrlEncode(whereClause);
var url = new Uri(_url.AbsoluteUri + where);
Debug.WriteLine(url.AbsoluteUri);
string result;
using (var client = new WebClient())
{
result = client.DownloadString(url);
}
JObject json = JObject.Parse(result);
IEnumerable<string> fields = from r in json["fieldAliases"].Children()
select ((JProperty)r).Name;
// Erm...not sure how to get this done.
// Basically need to populate class instances/rows with the
// values for each field where the list of fields is not
// known beforehand.
}
Sie können die JSON sehen ausspucken durch Besuchen Sie diese URL (beachten Sie die Codierung beim Ausschneiden und Einfügen): href = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/WaterTemplate/WaterDistributionNetwork/MapServer/1/query?f=json & outFields = * & wo = FACILITYID% 3d'13141 '
Also meine Frage (endlich!) Ist das. Wie durchlaufe ich die Sammlung von "Attributen" in den "Features", um die tatsächlichen Feldwerte zu erhalten. Sie können sehen, dass ich herausgefunden habe, wie man die Feldnamen aus dem fieldAliases bekommt, aber danach bin ich ratlos. Ich habe auf eine Datei mit dem JsonReader worden bastelt, der so aussieht, aber noch keine Freude:
{
"displayFieldName" : "FACILITYID",
"fieldAliases" : {
"FACILITYID" : "Facility Identifier",
"ACCOUNTID" : "Account Identifier",
"LOCATIONID" : "Location Identifier",
"CRITICAL" : "Critical Customer",
"ENABLED" : "Enabled",
"ACTIVEFLAG" : "Active Flag",
"OWNEDBY" : "Owned By",
"MAINTBY" : "Managed By"
},
"features" : [
{
"attributes" : {
"FACILITYID" : "3689",
"ACCOUNTID" : "12425",
"LOCATIONID" : "12425",
"CRITICAL" : 1,
"ENABLED" : 1,
"ACTIVEFLAG" : 1,
"OWNEDBY" : 1,
"MAINTBY" : 1
}
},
{
"attributes" : {
"FACILITYID" : "4222",
"ACCOUNTID" : "12958",
"LOCATIONID" : "12958",
"CRITICAL" : 1,
"ENABLED" : 1,
"ACTIVEFLAG" : 1,
"OWNEDBY" : 1,
"MAINTBY" : 1
}
}
]
}
Nun, das ist schön und einfach. danke für den Vorschlag. – Dylan