Laden...

Dynamisches Json in Klasse mappen

Erstellt von BerndFfm vor 2 Jahren Letzter Beitrag vor 2 Jahren 294 Views
BerndFfm Themenstarter:in
3.825 Beiträge seit 2006
vor 2 Jahren
Dynamisches Json in Klasse mappen

Hallo,

ich habe eine Json-Datei die je nach Element verschiedene Typen enthält. Wie kann ich eine Json-Datei mal in eine Klasse mal in eine andere Klasse mappen ?

Ich arbeite mit Newtonsoft.

Quelle der Json-Datei : http://download.seven-c.de/files/finderwille-frankfurt/einsatz-app/geojson/Hessen_Landkreise.geojson

Die Datei kommt hierher : http://opendatalab.de/projects/geojson-utilities/

Wenn ich mit Json-Util eine Klasse erzeuge kommt mal das eine mal das andere raus.

Der Unterschied liegt in der Klasse GeoJsonGeometry1/2, da sind die Koordinaten einmal eine dreifach verschachtelte Liste, einmal vierfach.
Liegt wohl daran dass es Landkreisgrenzen gibt die aus einem Polygon bestehen und die Bergstraße besteht z.B. aus 3 Plygonen.

Ich würde gerne in Klassen mappen ohne in den Json-Dateien rumzufuddeln.

Grüße Bernd


// Landkreise außer Bergstraße

	public class GeoJsonProperties1
	{
		public string name { get; set; }
	}

	public class GeoJsonCrs1
	{
		public string type { get; set; }
		public GeoJsonProperties1 properties { get; set; }
	}

	public class GeoJsonGeometry1
	{
		public string type { get; set; }
		public IList<IList<IList<double>>> coordinates { get; set; }
	}

	public class GeoJsonFeature1
	{
		public string type { get; set; }
		public GeoJsonProperties1 properties { get; set; }
		public GeoJsonGeometry1 geometry { get; set; }
	}

	public class GeoJson1
	{
		public string type { get; set; }
		public GeoJsonCrs1 crs { get; set; }
		public string source { get; set; }
		public IList<GeoJsonFeature1> features { get; set; }
	}

	// Bergstraße

	public class GeoJsonProperties2
	{
		public string name { get; set; }
	}

	public class GeoJsonCrs2
	{
		public string type { get; set; }
		public GeoJsonProperties2 properties { get; set; }
	}

	public class GeoJsonGeometry2
	{
		public string type { get; set; }
		public IList<IList<IList<IList<double>>>> coordinates { get; set; }
	}

	public class GeoJsonFeature2
	{
		public string type { get; set; }
		public GeoJsonProperties2 properties { get; set; }
		public GeoJsonGeometry2 geometry { get; set; }
	}

	public class GeoJson2
	{
		public string type { get; set; }
		public GeoJsonCrs2 crs { get; set; }
		public string source { get; set; }
		public IList<GeoJsonFeature2> features { get; set; }
	}

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

16.806 Beiträge seit 2008
vor 2 Jahren

In der Form gar nicht, denn im Endeffekt ist das eine Json Schema Verletzung - wäre in XML nicht anders.

Kannst Du das mit normalen Mitteln (im Sinne von OOP) nicht lösen, dann musst Du einen eigenen Dynamic Converter schreiben, der den Design-Fehler beim Json-Generieren ausbadet.
https://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm

BerndFfm Themenstarter:in
3.825 Beiträge seit 2006
vor 2 Jahren

Hallo Abt,

das habe ich befürchtet. Trotzdem danke für die Info.

Herausgeber der Datei ist IF-Core IT Services GmbH (OpenDataLab), eine kleine Softwarefirma in 74254 Offenau. Warum die das so machen erschließt sich mir nicht, denn es wäre an dieser Stelle überhaupt nicht nötig. Man könnte die Liste immer vierfach verschachteln. Wenn die Gemeinde nur einen Polygon enthält reicht es ja in der einen Liste nur ein Element anzulegen.

Vielleicht ist das keine Absicht sondern ein Fehler im Programm ?

Dann ändere ich lieber direkt in der Json-Datei. Ich muss ja nur "coordinates":[[[ in "coordinates":[[[[ ändern. Und "]]]" in "]]]]".

Grüße Bernd

PS.: Ich zeichne die Landkreise in eine Landkarte ein, das klappt echt gut ! Und man lernt noch was in Geografie ! Die nächste Aufgabe ist es festzustellen ob ich mich im Landkreis befinde oder nicht (Point in Polygon).

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

T
2.219 Beiträge seit 2008
vor 2 Jahren

Ich habe mir das Beispiel mal angeschaut.
Hier hast du auch ein Strukturproblem deiner Klassen.
Die Geometry musst du hier umbauen.

Z.b. bekommst du in Geometry sowohl Polygon als auch Multipolygon.
Dadurch kannst du auch nicht mit deiner IList Konstruktion vernünftig arbeiten.
Es gibt hier Polygon, dann hast du eine einfache Lat/Long Liste.
Bei Multipolygon bekommst du eine Liste von Polygonen.
Dadurch musst du deine Klassen entsprechend umbauen und das JS entsprechend selbst konvertieren

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 2 Jahren

T-Virus, das war nicht seine Frage. Die Unterschiede waren ihm ja bekannt.
Die Frage ist das Wie.

T
2.219 Beiträge seit 2008
vor 2 Jahren

@Abt
Hatte es dann falsch aufgefasst.

@BerndFfm
Ich vermute auch, dass die Verschachtelung bzw. die Struktur von Coordinates falsch ist.
Aktuell haben die laut Json für Polygon ein Array[1] in dem ein Array[n] für die Koordinaten Array[2] steckt.
Bei Multipolygon ist es dann noch ein Array[1] darüber.

Entweder wird das Json falsch generiert oder die Strukturen dahinter sind schon falsch.

Nachtrag:
Das Replace würde ich nicht empfehlen.
Dadurch kannst du zwar den jetzigen Zustand umgehen, würdest aber zukünftig ggf. auf deinen Fehler laufen.
Wenn die Verschachtelung korrigiert wird, dann läuft dein Replace ins leere.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

BerndFfm Themenstarter:in
3.825 Beiträge seit 2006
vor 2 Jahren

Ich denke es ist ein Fehler in der Dateien Generierung. Denn einen Sinn sehe ich da nicht.

Ich muss jetzt basteln. Wenn der Fehler behoben wird wäre das aber kein Problem für den Workaround.

Aber so klappt das !


json = json.Replace("[[[", "[[[[").Replace("[[[[[", "[[[[").Replace("]]]", "]]]]").Replace("]]]]]", "]]]]").Replace("]]]],[[[[", "]]],[[[");
GeoJsonAreas areas = JsonConvert.DeserializeObject<GeoJsonAreas>(json);
foreach (GeoJsonFeature area in areas.features) ...

Danke für die Antworten,

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3