2016-10-03 77 views
2

我有這樣的JSON數據:獲取JSON數組和項目添加到組合框在Delphi

[ 
    { 
    "Name":"val1", 
    "Age":"25" 
    }, 
    { 
    "Name":"Vtya", 
    "Age":"24" 
    }, 
    { 
    "Name":"fgani", 
    "Age":"21" 
    }, 
    { 
    "Name":"Shami", 
    "Age":"21" 
    }, 
    { 
    "Name":"Slakf", 
    "Age":"22" 
    } 
] 

我寫了這個代碼來解析數據和Name值添加到組合框:

procedure TJSON_Sample.FormCreate(Sender: TObject); 
var 
    LJsonArray: TJSONArray; 
    LJsonValue, LITEM: TJSONValue; 
    lJsonData: string; 
    ljsPair: TJsonPair; 
begin 
    LJsonArray := TJSONObject.ParseJSONValue(TEncoding. 
    Default.GetBytes(lJsonData), 0) as TJSONArray;//lJsonData contains the above mentioned JSON data 
    try 
    for LJsonValue in LJsonArray do 
    begin 
     for LITEM in TJSONArray(LJsonValue) do 
     begin 
     cmbBox_Name.Items.Add(TJsonPair(LITEM).JsonValue.Value); 
     end; 
    end; 
    finally 
    LJsonArray.Free; 
    end; 
end; 

當我運行它時,它將所有名稱和年齡添加到Combobox中。有人可以幫助我添加名稱嗎?

+0

我還想說,您使用未經檢查的強制轉換意味着如果您的代碼遇到具有不正確形式的數據,其行爲將以未定義的方式運行。您需要使用is和as運算符進行檢查類型測試和轉換。 –

回答

1

這解決了我的請求

procedure TJSON_Sample.FormCreate(Sender: TObject); 
var 
    LITEM, lJsonValue: TJSONValue; 
    lJsonData: string; 
begin 
    lJsonValue := TJSONObject.ParseJSONValue(TEncoding. 
    Default.GetBytes(lJsonData), 0);//lJsonData contains the above mentioned JSON data 
    if lJsonValue <> nil then 
    try 
     begin 
     for LITEM in lJsonValue as TJSONArray do 
     begin 
      cmbBox_Name.Items.Add(((LITEM as TJSONObject).Get('Name') .JsonValue as TJSONString).Value); 
     end; 
     end; 
    finally 
     lJsonValue.Free; 
    end; 
end; 
0

我會考慮使用Items.AddObject方法,並在組合框的OnChange事件上使用Items.Object[ComboBox1.ItemIndex]

2

您的代碼通過JSON循環良好。您的問題是在將項目添加到組合框時僅獲取「名稱」值。

嘗試GetValue('Name')而不是整個JSONValue.Value。

procedure TJSON_Sample.FormCreate(Sender: TObject); 
var 
    LJsonArray: TJSONArray; 
    LJsonValue, LITEM: TJSONValue; 
    lJsonData: string; 
    ljsPair: TJsonPair; 
begin 
    LJsonArray := TJSONObject.ParseJSONValue(TEncoding. 
    Default.GetBytes(lJsonData), 0) as TJSONArray;//lJsonData contains the above mentioned JSON data 
    try 
    for LJsonValue in LJsonArray do 
    begin 
     for LITEM in TJSONArray(LJsonValue) do 
     begin 
     cmbBox_Name.Items.Add(TJsonObject(LITEM).GetValue('Name').Tostring); 
     end; 
    end; 
    finally 
    LJsonArray.Free; 
    end; 
end; 
+1

'cmbBox_Name.Items.Add(TJsonObject(LITEM).GetValue('Name')。Tostring);'此語句獲取名稱列表並添加到ComboBox,但雙引號仍然保留,並且該語句應該被添加在末尾使用'.Tostring',只有代碼執行,否則會產生無效的類型錯誤。 – userhi

+0

確實,我是從記憶中寫下來的。固定。 –

0

這裏幾乎是相同的代碼,但我想補充BeginUpdate/EndUpdate的組合框項目和使用通用方法來避免類型轉換。

procedure TJSON_Sample.FormCreate(Sender: TObject); 
var 
    LJson, LItem: TJSONValue; 
    lJsonData: string; 
begin 
    cmbBox_Name.Items.BeginUpdate; 
    try 
    cmbBox_Name.Items.Clear; 

    LJson := TJSONObject.ParseJSONValue(TEncoding. 
     Default.GetBytes(lJsonData), 0);//lJsonData contains the above mentioned JSON data 

    if Assigned(LJson) then 
    begin 
     for LItem in LJson as TJSONArray do 
     cmbBox_Name.Items.Add(LItem.GetValue<string>('Name')); 
    end; 
    finally 
    cmbBox_Name.Items.EndUpdate; 
    end; 
end;