2016-12-01 7 views
2

Ниже мой JSON:Delphi разбор Json с несколькими типами массивов?

{ 
    "forms": { 
    "frmLogin": [ 
     { 
     "frmLoginPg": "Se connecter - Application de gestion de PC" 
     }, 
     { 
     "lbl_login_Title": "Application de gestion Pc" 
     }, 
     { 
     "lbl_loginName": "Nom d'utilisateur" 
     }, 
     { 
     "lblLanguage": "langue préférée" 
     }, 
     { 
     "btnLogin": "Se connecter" 
     }, 
     { 
     "btnReset_Loginfrm": "Réinitialiser" 
     } 
    ], 
    "frmHome": [ 
     { 
     "frmHomepg": "Accueil" 
     }, 
     { 
     "lbladdUser_Title": "Ajouter un utilisateur" 
     }, 
     { 
     "lblName": "prénom" 
     }, 
     { 
     "lblEmail": "EMail" 
     }, 
     { 
     "popmemFile": "Fichier" 
     } 
    ] 
    } 
} 

Я пытаюсь получить значение, присвоенное каждый ключ, так что я могу изменить Caption каждого компонента.

Я попробовал следующий путь, но я получаю сообщение об ошибке Invalid class typecast:

function Translationspg.GetTranslationsJson(formNameJson, frmName_FORMJson 
    : TComponentName; formsam: TForm): string; 
var 
    lJsonBytes: TBytes; 
    lJsonVal, lJsonScenar: TJSONValue; 
    lJsonScenarioValue: string; // lJsonString, 
    lJsonObj: TJSONObject; // , lJsonScenario 
    lJsonArray: TJSONArray; 
    lJsonScenarioEntry: TJSOnString; 
    lJsonPair: TJSONPair; 
begin 
    lJsonBytes := TFile.ReadAllBytes(scJSONFileName_French); 
    lJsonScenar := TJSONObject.ParseJSONValue(lJsonBytes, 0); 
    if lJsonScenar <> nil then 
    begin 
    lJsonArray := lJsonScenar as TJSONArray; 

    for lJsonVal in lJsonArray do 
    begin 
     lJsonObj := lJsonVal as TJSONObject; 
     lJsonPair := lJsonObj.Get(formNameJson); 
     lJsonScenarioEntry := lJsonPair.JsonString; 
     lJsonScenarioValue := lJsonScenarioEntry.Value;   
    end; 
    end; 
    Result := lJsonScenarioValue; 
end; 

ответ

6
lJsonArray := lJsonScenar as TJSONArray 

Корень вашего JSON не является массивом. Это объект. Эти объекты имеют одну пару имя/значение, называемую forms. Вы должны прочитать это, а затем искать форму по имени. Как это:

lJsonObj := TJSONObject.ParseJSONValue(lJsonBytes, 0) as TJSONObject; 
lJsonObj := lJsonObj.GetValue('forms') as TJSONObject; 
lJsonPair := lJsonObj.Get(formNameJson); 
.... 

Эта программа

{$APPTYPE CONSOLE} 

uses 
    System.SysUtils, System.JSON, System.IOUtils; 

procedure Main(const fileName, formName: string); 
var 
    lJsonBytes: TBytes; 
    lJsonObj: TJSONObject; 
    lJsonArray: TJSONArray; 
    lJsonValue: TJSONValue; 
    lJsonPair: TJSONPair; 
begin 
    lJsonBytes := TFile.ReadAllBytes(fileName); 
    lJsonObj := TJSONObject.ParseJSONValue(lJsonBytes, 0) as TJSONObject; 
    lJsonObj := lJsonObj.GetValue('forms') as TJSONObject; 
    lJsonArray := lJsonObj.GetValue(formName) as TJSONArray; 
    Writeln(fileName, ' ', formName); 
    for lJsonValue in lJsonArray do begin 
    lJsonObj := lJsonValue as TJSONObject; 
    for lJsonPair in lJsonObj do begin 
     Writeln(lJsonPair.JsonString.ToString, ': ', lJsonPair.JsonValue.ToString); 
    end; 
    end; 
    Writeln; 
end; 

begin 
    try 
    Main('C:\desktop\json.txt', 'frmLogin'); 
    Main('C:\desktop\json.txt', 'frmHome'); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    Readln; 
end. 

имеет следующий вывод:

 
C:\desktop\json.txt frmLogin 
"frmLoginPg": "Se connecter - Application de gestion de PC" 
"lbl_login_Title": "Application de gestion Pc" 
"lbl_loginName": "Nom d'utilisateur" 
"lblLanguage": "langue préférée" 
"btnLogin": "Se connecter" 
"btnReset_Loginfrm": "Réinitialiser" 

C:\desktop\json.txt frmHome 
"frmHomepg": "Accueil" 
"lbladdUser_Title": "Ajouter un utilisateur" 
"lblName": "prénom" 
"lblEmail": "EMail" 
"popmemFile": "Fichier" 
Смежные вопросы