![]() |
JSON Parsen
Ich habe ein Problem mit C# MVC, ich muss ein JSON Parsen der nicht immer gleich ist.
1. Zustand "[[\"Bezeichnung\",\"=\",\"2K-Gelcoat-PUR-Steodur-3kg\"]]" 2. Zustand "[[[\"Bezeichnung\",\"=\",\"2K-Gelcoat-PUR-Steodur-3kg\"]],\"and\",[[\"charge\",\"=\",\"11\"]]]" WIe kann ich das machen für Zustand 1 habe ich volgenden Code
Code:
JavaScriptSerializer serializer = new JavaScriptSerializer();
List<string[]> filterItems = serializer.Deserialize<List<string[]>>(filter); string buffer = ""; foreach (string[] filterItem in filterItems) { buffer = buffer + filterItem[0] + " " + filterItem[1] + " " + filterItem[2]; //list = FilterItems<YourItemType>(list, filterItem[0], filterItem[2]); } |
AW: JSON Parsen
Sei doch so lieb und zeige uns den puren JSON-Code (eingebettet in die CODE-Tags). Bei diesem String aus dem Debugger mit den Escape-Zeichen sieht man ja den Wald vor lauter Bäumen nicht.
Ich wette, dann wird dich auch schon die Lösung anspringen :stupid: |
AW: JSON Parsen
Sorry habs einfach aus dem Debug rasukopiert
1. [["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]] 2. [[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]],"and",[["charge","=","11"]]] |
AW: JSON Parsen
|
AW: JSON Parsen
Es ist eigentlich immer nur eine Variante. (im aktuellen Beispiel)
Delphi-Quellcode:
[WertA, Operator, WertB]
Code:
Auswertgung:
[ "Bezeichnung", Spalte "=", Vergleichsoperator "Angussstutzen..." Wert ] Verknüpfung [ [ VergleichA ], GruppeA "and", Operator [ VergleichB ] GruppeB ] interessant wären jetzt mehrere Verknüpfungen ... eventuell so, oder immer nur in 2er-Gruppen [ [ VergleichA ], GruppeA "and", Operator [ VergleichB ] GruppeB "and", Operator [ VergleichC ] GruppeC ] [ [ VergleichA ], GruppeA "and", Operator [ [ VergleichB ] GruppeB.A "and", Operator [ VergleichC ] GruppeB.B ] ] |
AW: JSON Parsen
Wenn ich die eckigen Klammern zähle, dann sehe ich das etwas anders
|
AW: JSON Parsen
Lege zwei "Auswertgung" in ein "Verknüpfung" rein und schon kommt das doch mit den Klammern doch hin?
|
AW: JSON Parsen
Zitat:
Die Frage dreht sich hier aber ganz speziell um die Erkennung dieser beiden Fälle |
AW: JSON Parsen
Mal eben so heruntergetippt ...
Delphi-Quellcode:
und liefert
program Project2;
{$APPTYPE CONSOLE} {$R *.res} uses System.Json, System.SysUtils; function IsEven( const Value: Integer ): Boolean; begin Result := Value mod 2 = 0; end; function ParseSingleExpression( AJsonArray: TJsonArray ): string; var lInner : TJsonArray; lFieldName: string; lOperator : string; lValue : string; begin if AJsonArray.Count <> 1 then raise EArgumentException.Create( 'single item in array expected' ); if not( AJsonArray.Items[ 0 ] is TJsonArray ) then raise EArgumentException.Create( 'array expected' ); lInner := AJsonArray.Items[ 0 ] as TJsonArray; if lInner.Count <> 3 then raise EArgumentException.Create( 'three items expected' ); if not( lInner.Items[ 0 ] is TJSONString ) then raise EArgumentException.Create( 'string expected' ); lFieldName := lInner.Items[ 0 ].Value; if not( lInner.Items[ 1 ] is TJSONString ) then raise EArgumentException.Create( 'string expected' ); lOperator := lInner.Items[ 1 ].Value; if lInner.Items[ 2 ] is TJSONString then lValue := QuotedStr( lInner.Items[ 2 ].Value ) else lValue := lInner.Items[ 2 ].Value; Result := string.Format( '(%s %s %s)', [ lFieldName, lOperator, lValue ] ); end; function ParseJsonExpression( AJsonArray: TJsonArray ): string; overload var I: Integer; begin if IsEven( AJsonArray.Count ) then raise EArgumentException.Create( 'odd items in array expected' ); if AJsonArray.Count = 1 then Result := ParseSingleExpression( AJsonArray ) else begin Result := '( '; for I := 0 to AJsonArray.Count - 1 do begin if I mod 2 = 0 then if AJsonArray.Items[ I ] is TJsonArray then Result := Result + ParseJsonExpression( AJsonArray.Items[ I ] as TJsonArray ) else raise EArgumentException.Create( 'Array expected' ) else Result := Result + ' ' + AJsonArray.Items[ I ].Value + ' '; end; Result := Result + ' )'; end; end; function ParseJsonExpression( AJsonStr: string ): string; overload; var lValue: TJSONValue; begin lValue := TJSONObject.ParseJSONValue( AJsonStr ); try if lValue is TJsonArray then Result := ParseJsonExpression( lValue as TJsonArray ) else raise EArgumentException.Create( 'Fehlermeldung' ); finally lValue.Free; end; end; const Data1 = '[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]]'; Data2 = '[[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]],"and",[["charge","=","11"]]]'; Data3 = '[[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]],"and",[["charge","=","11"]],"and",[[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]],"and",[["charge","=","11"]]]]'; procedure Main; begin WriteLn( Data1 ); WriteLn( ParseJsonExpression( Data1 ) ); WriteLn; WriteLn( Data2 ); WriteLn( ParseJsonExpression( Data2 ) ); WriteLn; WriteLn( Data3 ); WriteLn( ParseJsonExpression( Data3 ) ); end; begin try Main( ); except on E: Exception do WriteLn( E.ClassName, ': ', E.Message ); end; ReadLn; end.
Code:
[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]]
(Bezeichnung = 'Angussstutzen-Rev/B-PPTV30') [[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]],"and",[["charge","=","11"]]] ( (Bezeichnung = 'Angussstutzen-Rev/B-PPTV30') and (charge = '11') ) [[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]],"and",[["charge","=","11"]],"and",[[["Bezeichnung","=","Angussstutzen-Rev/B-PPTV30"]],"and",[["charge","=","11"]]]] ( (Bezeichnung = 'Angussstutzen-Rev/B-PPTV30') and (charge = '11') and ( (Bezeichnung = 'Angussstutzen-Rev/B-PPTV30') and (charge = '11') ) ) |
AW: JSON Parsen
Sorry4OT: So viel zum Thema "JSON ist sooo einfach" :D XML hat halt etwas mehr overhead, aber einfacher als JSON ist es allemal.
Sherlock |
AW: JSON Parsen
Zitat:
Ich habe es jetzt gelöst etwas Krank aber es geht, ich habe den String in ein Array zerlegt. |
AW: JSON Parsen
Zitat:
Wenn diese spezielle Syntax nicht so aufgebläht wäre und man die zu Verfügung stehenden Datentypen benutzen würde, wäre JSON deutlich einfacher. Hier sind allerdings unnötig verschachtelte Klammern und es werden nur Arrays statt Objekte verwendet. Ein tolles Beispiel für ziemlich schlechte Verwendung von JSON. Mein Vorschlag für Variante 2 aus #4:
Code:
Vorteile:
{
"left": { "left": "Bezeichnung", "op": "=", "right": "Angussstutzen-Rev/B-PPTV30" }, "op": "and", "right": { "left": "charge", "op": "=", "right": "11" } }
|
AW: JSON Parsen
Zitat:
Gruß K-H |
AW: JSON Parsen
Laut dem Titel geht es hier um C#.
Und da gibts mit Newtonsoft.JSON ein Library das das komplett übernimmt. man schmeisst das Json da nur rein und bekommt ein deserialisiertes Objekt zurück mit dem man weiter arbeiten kann. |
AW: JSON Parsen
Zitat:
![]() Madas |
AW: JSON Parsen
Zumindest "Lesen können" ist doch recht hilfreich bei der Fehlersuche.
(Das ist nichts gegen Superobject gesagt!!) Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz