-2
votes

/ ui2 / cl_json => désérialisze ne remplit pas la structure

J'ai deux types de JSON: résultat code> et Erreur code>.

J'essaie de désagréaliser ces deux Json à ma structure interne, mais il y a un problème. p>

uniquement pour résultat code> La fonction fonctionne correctement, pour erreur code> la structure est toujours vide. p>

Quelqu'un peut-il m'aider à résoudre Mon problème ou indiquer mon erreur? P>

Voici mon JSON: P>

DATA go_textedit TYPE REF TO cl_gui_textedit.
PARAMETERS: json TYPE string.

AT SELECTION-SCREEN OUTPUT.
  IF go_textedit IS NOT BOUND.
    CREATE OBJECT go_textedit
      EXPORTING
        parent = cl_gui_container=>screen0.
    go_textedit->set_textstream( json ).
  ENDIF.

AT SELECTION-SCREEN.
  go_textedit->get_textstream( IMPORTING text = json ).
  cl_gui_cfw=>flush( ).
TYPES: BEGIN OF stt_result,
             to       TYPE string,
             id       TYPE string,
             code     TYPE string,
           END OF stt_result.

TYPES: BEGIN OF stt_error,
             name   TYPE string,
             date   TYPE string,
             id     TYPE string,
             descr  TYPE string,
             result TYPE string,
           END OF stt_error.

DATA: BEGIN OF ls_response_result,
       result TYPE STANDARD TABLE OF stt_result,
       error  TYPE STANDARD TABLE OF stt_error,
END OF ls_response_result.

/ui2/cl_json=>deserialize( EXPORTING json        = lv_cdata
                                     pretty_name = /ui2/cl_json=>pretty_mode-camel_case
                           CHANGING  data        = ls_response_result ).


5 commentaires

N'a pas essayé votre code, car le JSON n'est pas valide (il manque probablement d'un externe [ et ] ) et n'est pas fourni dans un format pouvant être copié directement dans un test Rapport (il me manque le lv_cdata = '\ {... .) Veuillez fournir un exemple minimal fonctionner . Cependant, votre type ls_response_result me semble tromper, car la valeur derrière la clé erreur dans vos données JSON est un objet / dictionnaire, mais votre type attendait une table / liste / liste .


@konstantin J'ai ajouté la partie manquante du code pour l'OP (j'ai ajouté un écran afin que le Json puisse être collé) afin que vous puissiez le tester.


Désolé mais la date dans votre JSON semble être un tableau (il y a [] là-bas, qui est une matrice vide) non une chaîne, d'ailleurs résultat N'appartient pas à erreur dans votre fichier JSON non plus.


Merci à tous pour vos réponses. L'erreur constructure ne doit pas appartenir à résultat , c'est pourquoi je les divise en deux constructions d'indépendance. Je veux dire, je ne peux en obtenir qu'une seule d'entre elles, résultat ou erreur .


Ce n'est toujours pas clair. Pouvez-vous modifier votre message et entrer le résultat attendu (éventuellement via un code de test, comme l'a fait Florian)?


3 Réponses :


4
votes

Réviser vos déclarations de type. Il y a une divergence dans un endroit où vous vous attendez à un résultat en tant que matrice JSON (table ABAP) contre un objet JSON (structure ABAP).

Ceci est le code complet que j'ai utilisé: xxx

vérifié avec la classe d'essai: xxx


2 commentaires

Malheureusement ça ne marche pas. Ma structure de résultat est toujours vide.


Partagé mon code complet comme référence. Cela vous aide peut-être à déterminer ce qui est différent?



-1
votes

Merci à tous pour votre conseil.

Je résolvai mon problème. P>

Le cas était: Je reçois du fournisseur deux types de JSON: résultat code> ou error code>. P>

Je ne peux pas les obtenir tous les deux en même temps. P >

J'ai besoin de les désérialiser à ma structure interne. p> xxx pré>

et p> xxx pré>

voici mon code ABAP nécessaire , qui fonctionne correctement. P>

PS: Mon erreur était que j'ai travaillé avec erreur code> comme avec une table interne au lieu de la structure. P>

TYPES: BEGIN OF stt_result,
             to       TYPE string,
             id       TYPE string,
             code     TYPE string,
           END OF stt_result.

    TYPES lt_data TYPE STANDARD TABLE OF string WITH EMPTY KEY.

    TYPES: BEGIN OF stt_error,
             name   TYPE string,
             date   TYPE lt_data,
             id     TYPE string,
             descr  TYPE string,
             result TYPE stt_result,
           END OF stt_error.

    DATA: BEGIN OF ls_response_result,
            result TYPE STANDARD TABLE OF stt_result,
            error  TYPE stt_error,
          END OF ls_response_result.

/ui2/cl_json=>deserialize( EXPORTING json = lv_cdata
                                     pretty_name = /ui2/cl_json=>pretty_mode-camel_case
                           CHANGING  data        = ls_response_result ).


2 commentaires

Je ne vois pas le besoin de poster tout le code. La seule erreur de votre code est que vous avez essayé de mapper un objet JSON avec une table interne ABAP, mais elle peut être mappée que par une structure ABAP (et une matrice JSON ne peut être mappée que par une table interne ABAP). Permettez-moi de poster une réponse qui est plus concise.


Je t'ai eu, Sandra. J'ai corrigé mon code ABAP et partage ma solution, déjà. Merci pour vos conseils et vos commentaires.



4
votes

Un objet JSON {...} ne peut être mappé que par une structure ABAP.

Un tableau JSON [...] ne peut être mappé que par une table interne ABAP.

dans votre code, l'erreur JSON est un objet JSON, mais la variable ABAP est une table interne.

Vous devriez donc Corrigez la variable ABAP en supprimant le tableau standard de de sorte qu'il devient une structure: xxx


0 commentaires