2016-06-06 9 views
0

Ich habe Probleme beim Aufruf von json_extract_path_text (my_field, 'some_key') auf ein Feld, das '[]' als Daten enthält.json_extract_path_text ('[]', 'some_key') einen Fehler auf gültige JSON-Zeichenfolge werfen

Es ist eine gültige JSON-Zeichenfolge, aber diese Funktion wirft einfach einen Fehler.


ERROR: JSON Parsingfehler

DETAIL:

Fehler: JSON Parsingfehler

Code: 8001

Kontext: ungültige JSON-Objekt []

Abfrage : 0

Standort: funcs_json.h: 117


Gibt es gute Abhilfe für dieses Problem? Ich könnte wahrscheinlich eine AND my_field != '[]' Überprüfung hinzufügen, aber wer weiß, was noch überprüft werden muss?

+0

Sind Sie wirklich auf Redshift? Ist das * gesamte * json-Feld nichts als '[]', d. H. Das json ist ein einzelnes leeres Array? Wenn ja, ist ein Array kein json-Objekt, leer oder nicht, es ist ein Array. Sie können kein Feld eines Arrays abrufen. –

+0

Ein leeres Array [] ist eine gültige JSON-Zeichenfolge von JSONLint, nicht wahr? –

+0

Ja, '[]' ist ein gültiges json * -Dokument *, aber es ist kein json * -Objekt *. Sie können keinen Schlüssel in einem Array nachschlagen, sie haben nur Indizes. Allerdings erlaubt PostgreSQL (mindestens 9.5) dies. Also ich vermute, es ist ein Rotverschiebungsproblem. –

Antwort

0

Dies scheint das Ergebnis einer kürzlich vorgenommenen Änderung der json_extract_path_text-Funktion zu sein, die bei Arrays fehlschlägt.

Wie Craig darauf hinweist, ist der Fehler technisch korrekt, da es sich um ein Array und nicht um ein Json-Objekt handelt.

Sie versucht sein könnten, json_extract_array_element_text zu verwenden (‚json string‘, pos) wie in:

json_extract_path_text(json_extract_array_element_text(my_field, 0), 'some_key') 

Aber wenn Ihre Daten eine Mischung von Objekten und Arrays ist, wird diese auch nicht mit dem ebenso -technically-correct-nicht-wirklich-just-ärgerliche Fehler von

"context: invalid json array object {"somekey":"somevalue"}" 

natürlich ist die Schönheit dieser versagt ist, dass ein einzelner wonk out wird auch Ihre gesamte Abfrage töten. Eine Abhilfe könnte eine UDF, wie die folgenden sein:

create or replace function f_extract_if_list (j varchar(max)) 
returns varchar(max) 
stable 
as $$ 

    import json 

    if not j: 
     return None 

    try: 
     parsed_j = json.loads(j) 
    except ValueError: 
     return '' 

    if isinstance(parsed_j, dict): 
     return j 

    if isinstance(parsed_j, list) and len(parsed_j) >= 1: 
     return json.dumps(parsed_j[0]) 

    return '' 

$$ language plpythonu; 

Welche überprüft, ob das Element ein Array ist oder nicht und wenn ja, liefert das erste Element des Arrays. Je nach Anwendungsfall kann eine Feinabstimmung erforderlich sein. https://forums.aws.amazon.com/thread.jspa?messageID=728647&

Hoffnung, die hilft: http://docs.aws.amazon.com/redshift/latest/dg/user-defined-functions.html

So oder so, ich habe etwas über diese in den AWS-Foren zu posted:

Weitere Informationen über benutzerdefinierte Funktionen finden Sie hier!