4 votes

Comment analyser un tableau JSON dans RAd Studio ?

J'essaie d'analyser le document Json suivant :

[
  {"EventType":49,"Code":"234","EventDate":"20050202", "Result":1},
  {"EventType":48,"Code":"0120","EventDate":"20130201", "Group":"g1"}
]

J'utilise le code suivant :

TJSONObject* jsonread0 = (TJSONObject*) TJSONObject::ParseJSONValue(TEncoding::ASCII->GetBytes(Memo1->Lines->Text), 0);

for(int i=0;i<jsonread0->Size();i++)
{
    TJSONPair* pair = jsonread0->Get(i);

A ce stade, pair.JsonValue est NULL. Que dois-je faire pour lire les valeurs ?

18voto

RRUZ Points 98685

Vous n'effectuez pas l'encodage de la chaîne JSON correctement. Vous devez l'encoder en tant que TJSONArray, puis itérer sur les éléments.

essayez ces échantillons

Delphi

{$APPTYPE CONSOLE}

uses
  DBXJSON,
  System.SysUtils;

Const
StrJson =
  '['+
  '{"EventType":49,"Code":"234","EventDate":"20050202", "Result":1},'+
  '{"EventType":48,"Code":"0120","EventDate":"20130201", "Group":"g1"}'+
  ']';

procedure ParseJson;
var
  LJsonArr   : TJSONArray;
  LJsonValue : TJSONValue;
  LItem     : TJSONValue;
begin
   LJsonArr    := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(StrJson),0) as TJSONArray;
   for LJsonValue in LJsonArr do
   begin
      for LItem in TJSONArray(LJsonValue) do
        Writeln(Format('%s : %s',[TJSONPair(LItem).JsonString.Value, TJSONPair(LItem).JsonValue.Value]));
     Writeln;
   end;
end;

begin
  try
    ParseJson;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

C++ Builder

#include <vcl.h>
#include <windows.h>

#pragma hdrstop
#pragma argsused

#include <tchar.h>
#include <stdio.h>
#include <DBXJSON.hpp>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    TJSONArray* LJsonArr = (TJSONArray*)TJSONObject::ParseJSONValue(
    BytesOf((UnicodeString)"[{\"EventType\":49,\"Code\":\"234\",\"EventDate\":\"20050202\", \"Result\":1},  {\"EventType\":48,\"Code\":\"0120\",\"EventDate\":\"20130201\", \"Group\":\"g1\"}]"),0);
    int size = LJsonArr->Size();
    for (int i = 0; i < size; ++i)
    {
      TJSONValue* LJsonValue = LJsonArr->Get(i);
      TJSONArray*  LJsonArr2 =  (TJSONArray*)LJsonValue;
      int size2 = LJsonArr2->Size();
        for (int j = 0; j < size2; ++j)
        {
          TJSONValue* LItem   = LJsonArr2->Get(j);
          TJSONPair* LPair = (TJSONPair*)LItem;
          printf("%s %s \n", (UTF8String )(LPair->JsonString->Value()).c_str(),  (UTF8String )(LPair->JsonValue->Value()).c_str());
        }
    }
    std::cin.get();
    return 0;
}

Cela donnera

EventType : 49
Code : 234
EventDate : 20050202
Result : 1

EventType : 48
Code : 0120
EventDate : 20130201
Group : g1

2voto

Rob Kennedy Points 107381

Vous avez un type invalide, donc ce que vous voyez est un comportement non défini. Un résultat nul est juste un des nombreux résultats possibles que vous pourriez attendre de ce code. Le site ParseJSONValue dans ce cas, la fonction doit retourner un TJsonArray et non un TJsonObject . Bien que les deux classes aient Get les méthodes, elles ne sont pas interchangeables.

Le tableau Get renvoie un TJsonValue et non un TJsonPair . Pour ces données particulières, vous pouvez effectuer une conversion de type pour obtenir la valeur suivante TJsonObject parce que vos données représentent un tableau de deux objets.

Utilisez dynamic_cast ou de Delphi as pour passer d'une classe à une autre.

2voto

Arioch 'The Points 8056

L'analyseur JSON de dbExpress était réputé être lourd et parfois problématique.

Vous pouvez peut-être choisir un certain nombre d'analyseurs syntaxiques de tierces parties, par exemple ce tableau de lecture : http://code.google.com/p/superobject/wiki/first_steps

0voto

AngeloDM Points 377

Vous pouvez également obtenir un tableau à partir d'une chaîne JSON en utilisant la bibliothèque JSonCBuilderBlog pour C++Builder (gratuite et open source) :

UnicodeString JSONSource =
"[{\"EventType\":49,\"Code\":\"234\",\"EventDate\":\"20050202\", \"Result\":1},"
"{\"EventType\":48,\"Code\":\"0120\",\"EventDate\":\"20130201\",\"Group\":\"g1\"}]";

int           Type; 
UnicodeString Code;
UnicodeString Date;
int           Result;

TMetaObject MyArray;

MyArray.Decode(JSONSource);

for(int i=0; i < MyArray.Count(); i++)
{
    Type   = MyArray[i]["EventType"];
    Code   = MyArray[i]["Code"];
    Date   = MyArray[i]["EventDate"];
}

La syntaxe est très simple, voir le lien suivant comme référence : JSONCBuilderBlog bibliothèque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X