2016-07-05 41 views
0

我已經閱讀了一些在互聯網上的JSON工作。作爲一個noob,期待我不要跟你們中的一些人一樣善於追查例子,因爲我需要知識來知道要尋找什麼來獲取知識。 Catch22。 ;-)簡單的JSON工作:提取密鑰和值

我使用superobject,似乎是最好的方式。

我的問題是,我需要將JSON分離爲鍵/值對,到目前爲止,只有我知道密鑰是什麼,才能獲得價值。 將對所有可能的命令檢查密鑰(在我的應用中密鑰是[命令]),並且當命令匹配時,值部分是逗號分隔的參數列表,作爲將由側。服務器/客戶端然後調用該命令(一個過程/函數)並傳遞[commaText]作爲其參數。 (可能有JSON在政治上正確的方式取代[commaText],當然你可以對此發表評論,但到目前爲止,[commaText]對我來說是一個簡單而容易的方式。

更短:我需要從一個JSON對提取兩種[鍵值]和[數值數值]

這是我迄今爲止的工作是什麼:

function TWebSocketServer.GetValue(const AData: String; 
    Key: String): String; 
var 
    JSON: ISuperObject; 
    rowItem: ISuperObject; 
    ADataStringStream: TStringStream; 
begin 
    ADataStringStream := TStringStream.Create(AData); 
    JSON := TSuperObject.ParseStream(ADataStringStream, False); 

    rowItem := JSON[Key]; 
    if Assigned(rowItem) then 
    Result := rowItem.AsString 
    else Result := ''; 
end; 

這讓我對中的價值如果我已經知道該密鑰對是什麼。

重述:需要提取b其他鍵/值作爲JSON數據的單獨字符串(通常/基本上,我將擁有多個密鑰對,其一個命令/一個傳輸)

更多背景:我有一個SQLDatabase/App-Server /許多客戶實施。 (應用程序服務器I/O < - > SQL,計算並輸出到客戶端,客戶端接收來自應用程序服務器的輸入/函數調用,更新其值,然後用戶可以調用應用程序服務器上的函數使用客戶端調用該函數 - 使用websockets進行通信 應用程序服務器和客戶端都可以調用api中的函數和過程,但它將成爲客戶端服務器或服務器客戶端的一個命令。

如果它可能不是更容易地創建一個特殊的情況下JSON解析器,因爲我的數據常是隻有一對,而不是一個大的JSON對象我想知道......

請,有什麼建議可以理解的

PS。德爾福10.1柏林,Windows10 64

+1

該庫的示例向您展示如何使用 –

+0

什麼庫@DavidHeffernan? http://docwiki.embarcadero.com/RADStudio/Seattle/en/JSON只構建鍵/值對,但不提取它們。 – chillum

+1

您正在使用超級對象。閱讀其文檔。並且FWIW您提到的Emba庫確實支持枚舉JSON對象 –

回答

3

感謝大衛,我所需要的:-)

這個簡單的例子顯示了正是我想要的!

procedure TfrmWebSocketServer.Button3Click(Sender: TObject); 
var 
    item: TSuperAvlEntry; 
    obj: ISuperObject; 
begin 
    obj := SO('{"Command": "Parameters, Parameters"}'); 
    for item in obj.AsObject do 
    begin 
    vcl.Dialogs.ShowMessage(item.Name); //outputs "Command" 
    vcl.Dialogs.ShowMessage(item.Value.AsString); //outputs "Parameters, Parameters" 
    end; 
end;