Entwickler-Ecke

ASP.NET und Web - JSON mit JSON.net nach bestimmten Anforderungen sortieren


billy01 - Do 08.09.16 13:46
Titel: JSON mit JSON.net nach bestimmten Anforderungen sortieren
Hallo,

hier meine zweite Frage zum Thema JSON und Sortierung.

Gegeben ist folgendes:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
[
    {
      "Klasse": "05A",
      "Datum": "6-8-"
    },
    {
      "Klasse": "05D",
      "Datum": "6-8-"
    },
    {
      "Klasse": "05B",
      "Datum": "6-8-"
    },
    {
      "Klasse": "05C",
      "Datum": "6-8-"
    },
    {
      "Klasse": "06A",
      "Datum": "6-8-"
    },
    {
      "Klasse": "06A",
      "Datum": "7-8-"
    },
    {
      "Klasse": "10C",
      "Datum": "6-8-"
    },
    {
      "Klasse": "06B",
      "Datum": "6-8-"
    }]


Ich brauche es aber so, dass alle Klassen so sortiert sind: 05A, 05B, 06D, 06E usw. Das Datum des JSON-"Blocks" muss aber mitsortiert werden, zuerst käme dann der 6.8 (die Striche können ruhig da sein) und dann der 7.8.

Hätte hier jemand von euch eine Idee, wie das gehen könnte?

Desweiteren kommen manche Klassen für ein Datum doppelt vor, gibt es eine Methode, mit der ich solche "Duplikate" rausfiltern kann?

Danke!

Billy.


Ralf Jansen - Do 08.09.16 14:56

Wo willst du sortieren?

In der Datei ist die Reihenfolge unbedeutend es ist ja nur ein File. Aus der Json Perspektive ist eine Menge A,B zu B,A identisch. Es ist nichts anderes.
Wenn du irgendwo eine bestimmte Reihenfolge brauchst mußt du den Elementen die du im Json ~sortiert~ haben willst eine entsprechende Eigenschaften geben die die Reihenfolge beim Nutzer der Json Datei bestimmt. Du bräuchtest also neben denn Klasse und Datum Eigenschaften noch eine Positions/Sortierung Eigenschaft die z.B. eine fortlaufende Nummer enthält nach der du später sortieren kannst egal in welcher Reihenfolge di ein der Datei stehen.

Wenn der Nutzer der Json Datei außerhalb deines Einflusses liegt, du das Format nicht anpassen kannst aber diese Sortierung im File sein mußt hast du ein Problem. Die Json Bibliotheken werden die Reihenfolge eher zufällig bestimmen da der JSON Standard keine vorschreibt. Du könntest Glück haben das z.B. JSON.Net das im Moment in einer gewissen Reihenfolge macht du kannst aber nicht davon ausgehen das das in jeder zukünftigen Konstellation so bleibt. Da es undefiniert ist könnte sich bei Systemänderungen außerhalb deiner Kontrolle z.B. anderes .Net Framework Version, anderes OS, andere Hotfixes für Framework, OS das Verhalten anders sein.


billy01 - Do 08.09.16 15:34

Okay, ich habe meiner Datei jetzt in jedem Block noch eine "ID" bestehend aus Klasse und Datum hinzugefügt. Beispiel: "ID": "05A6-8-"

Anhand der ID sollte das dann gehen oder?


Ralf Jansen - Do 08.09.16 15:40

Wenn über diese ID sinnvoll sortierbar ist ja.


billy01 - Do 08.09.16 16:19

Ich habe jetzt beispielsweise das hier gefunden: http://stackoverflow.com/questions/14417235/c-sharp-sort-json-string-keys

Leider bringt mir das nicht viel, wie kann ich denn meine Datei in die markierte Lösung einlesen?


Ralf Jansen - Do 08.09.16 22:23

Dort werden die dem JSON entsprechenden Objekte im Speicher sortiert. Wie ich versucht habe zu erklären hat diese Sortierung nix oder nur zufällig was mit der Sortierung in der daraus entstehenden JSON Datei zu tun. Nur weil es auf Stackoverflow die akzeptierte Antwort ist heißt das nicht das die gut ist.

Wenn ich mal als Basis den von mir gezeigten Code in deinem anderen Thread nehme könntest du denn so sortieren.


C#-Quelltext
1:
2:
var list = JsonConvert.DeserializeObject<List<Temp_Felder>>(File.ReadAllText(pathToSourceFile));
list = list.OrderBy(x => x.Datum).ThenBy(y => y.Klasse).ToList();


Das entspricht logisch dem was in dem verlinkten Beitrag passiert.
Möglicherweise serialisiert das JSON.Net dann auch zufällig in der Reihenfolge wenn man die Liste serialisiert. Damit das auch bei spätere Benutzung der Software auch so bleibt muss man halt kräftig Daumen drücken.


billy01 - Fr 09.09.16 09:52

Hallo Ralf,

es klappt jetzt.

Danke!