![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:41 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