2017-06-12 3 views
-2

Ich muss Daten vom Server in JSON erhalten. Der Datensatz ist sehr groß und hat eine mehrstufige Verschachtelung. Ich benutze Arrays. Und einige Schlüssel innerhalb des Arrays sind JSON-Strings (ich muss diese Strings in der Datenbank speichern, um später JS-Objekte aus diesen Strings zu erzeugen).PHP json_encode() und Javascript JSON.parse()

Array(
    'key1'=> 'value1', 
    'key2'=> 'string in JSON format', // json_encode('key2_value that may contain russian symbols', JSON_UNESCAPED_UNICODE) 
    'key3'=> array(
     'key1'=> array(
      key1=> 'string in JSON format' 
     ) 
    ) 
) 

Die Verschachtelung von Elementen kann beliebig sein und jedes Element kann einen String im JSON-Format enthalten.

Ich kodiere dieses riesige Array in JSON, mit PHP json_encode($data, JSON_UNESCAPED_UNICODE) Funktion. Ich benutze zweiten Parameter, weil Daten russische Symbole enthalten können (ich muss einige dieser Zeichenfolgen später suchen). Danach empfangen i data ...

Schritt 1:

Decode alle Array mit JSON Strings JS JSON.parse() Funktion.

2 Schritt:

speichern einige JSON-Strings in Datenbankspalten und nach JS-Objekte erstellen JSON.parse() verwenden.

Einige Strings können jedoch unzulässige JSON-Zeichen enthalten, insbesondere "\ r". Und wenn ich versuche, diese Zeichenfolge mit JSON Pars zu analysieren, kann ich JSON.parse Fehler im zweiten Schritt für jetzt erhalten. Aber in der Theorie kann es auch im ersten Schritt vorkommen.

Aber PHP json_decode funktioniert gut! JS JSON.parse funktioniert schlecht!

Hat jemand eine Idee und Anregungen? (Bitte vergiss nicht, wenn ich json_encode im main-Array verwende, verschachtelte json-Strings, die russische Symbole enthalten können, entkamen auch - Schrägstriche, "", d. H.).

+0

Also, verwenden Sie nicht 'JSON_UNESCAPED_UNICODE'.Wenn Sie nicht mit einem sehr kaputten Browser arbeiten, sollten Sie bei vollständig codierten Daten keine Probleme mit 'JSON.parse' haben. Und wenn Sie das tun, können Sie einfach einen Platzhalter verwenden, wie '~~~ r'. Sie würden "\ r" durch den Platzhalter ersetzen, bevor Sie 'json_encode()' ausführen, dann ersetzen Sie den Platzhalter durch '\ r', nachdem Sie' JSON.parse() 'ausgeführt haben. Je nachdem, was du mit "sehr groß" meinst, sollte das nicht zu einer schlechten Leistung führen. –

+0

1 Frage: Ok. Aber '\ r' ist einer der verbotenen Charaktere. Mein Datensatz ist in der Nähe von 500 KB Größe. Und spezielle Symbole im Haupt-Array in JSON-Strings wieder entkommen. 2 Frage: Ich schreibe mobile Android-Anwendung mit Phonegap. Ich benutze SQLite Datenbank. Wenn ich Daten einfüge, kann das Russische Symbole ohne JSON_UNESCAPED_UNICODE enthalten ... Wenn ich in russischen Datenbanksymbolen suche, werde ich Probleme haben? –

+0

Ich fürchte, ich folge deinem Kommentar nicht wirklich. Ich verstehe, dass eine literale Wagenrücklauf in JSON nicht gültig ist; deshalb müssen Sie es verschlüsseln. Ich bin mir nicht sicher, warum Sie sagen, dass die Codierung ein Problem ist. JSON.parse sollte die codierten Daten korrekt interpretieren. –

Antwort

0

Sie haben mich nicht verstanden ... Ich habe 2 Lösungen meines Problems gefunden !!!!!!!

  1. Ich codiert mit JSON_UNESCAPED_UNICODE-Filter Main Array, die interne Elemente im JSON-Format mit JSON_UNESCAPED_UNICODE-Filter enthalten.

(interne Elemente Store nicht in der Datenbank analysiert)

ich meine Json Reihe in Browser drucken, danach kopieren Sie sie und versuchen, es in der Konsole zu analysieren. Es wurde erfolgreich analysiert. Aber als ich versuchte, interne Eigenschaftenwerte im JSON-Format zu parsen, bekam ich Parse-Fehler in speziellen Zeichenpositionen.

Ich empfange diese Zeile in meiner App und es analysiert gut, einschließlich der internen Eigenschaften Werte im JSON-Format !!!

  1. Ich kann den JSON_UNESCAPED_UNICODE-Filter nicht verwenden.

Ich Parse Main Array. Fügen Sie übliche Zeichenfolgen ein, die russische Symbole in der Datenbank enthalten. Ich kann die Suche in der Datenbank verwenden. Aber wenn ich json Zeichenketten in Datenbank mit russischen Zeichen einfügen werde, wird es wie '\ u0413 \ u043e \ u0440 \ u043e \ u0434' eingefügt und ich kann SUCHE NICHT VERWENDEN.

Meine Lösung ist es - JSON.stringify (JSON.parse ('JSON String')) vor dem Einfügen Datensatz in der Datenbank. In diesem Fall wird es korrekt eingefügt und ich kann die Suche verwenden.