2016-07-04 3 views
1

私はJSON文字列をダウンロードするデルファイ2010年に以下のコードを書いた:オブジェクトをjson形式で取得しますか?

procedure TForm1.Button1Click(Sender: TObject); 
var 
    strResult: string; 
    listParams: TStringList; 
    JO :TJSONObject; 
    JV : TJSONValue; 
begin 
    listParams := TStringList.Create; 
    listParams.Add('action=GET'); 
    listParams.Add('userid=(11,12,13)'); 
    try 
    strResult := idhttp1.Post('http://xxxnet/api/users.php', listParams); 
    Memo1.Lines.Text:=strResult; 
    JO := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(strResult), 0) as TJSONObject; 
    JV := JO.Get(0).JsonValue; 
    Memo2.Lines.Add(JV.Value); 
    finally 
    listParams.Free; 
    end; 
end; 

JSONは、単一のオブジェクトが含まれます。

{"usertitle":"Mark","userid":"13","username":"950","useremail":"","success":"1","error":""} 

コードは良い作品を。

しかし、JSONは、複数のオブジェクトが含まれます。エラー「アドレス00522275でのアクセス違反」と

[{"usertitle":"Yani","userid":"11","username":"887","useremail":"[email protected]","success":"1","error":""},{"usertitle":"Frank","userid":"12","username":"851","useremail":"","success":"1","error":""},{"usertitle":"Mark","userid":"13","username":"950","useremail":"","success":"1","error":""}] 

コードがクラッシュします。

答えて

1

あなたのコードには二つの問題があります。

  1. あなたはParseJSONValue()戻っているオブジェクトをリークしているが。あなたはそれを使用し終わったらFree()する必要があります。

  2. 2番目のJSONの例は、オブジェクトの配列です。 ParseJSONValue()TJSONObjectの代わりにTJSONArrayを返しますので、as TJSONObject型変換は失敗し、例外が発生します(ただし、アクセス違反は発生してはいけません)。

代わりにこのコードを試してみてください。

procedure TForm1.Button1Click(Sender: TObject); 
var 
    strResult: string; 
    listParams: TStringList; 
    JA: TJSONArray; 
    JO: TJSONObject; 
    JV, JV2: TJSONValue; 
begin 
    listParams := TStringList.Create; 
    try 
    listParams.Add('action=GET'); 
    listParams.Add('userid=(11,12,13)'); 
    strResult := idhttp1.Post('http://xxxnet/api/users.php', listParams); 
    finally 
    listParams.Free; 
    end; 
    Memo1.Lines.Text := strResult; 
    JV := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(strResult), 0); 
    try 
    if JV is TJSONObject then 
    begin 
     JO := TJSONObject(JV); 
     JV2 := JO.Get(0).JsonValue; 
     Memo2.Lines.Add(JV2.Value); 
    end 
    else if JV is TJSONArray then 
    begin 
     JA := TJSONArray(JV); 
     JO := JA.Get(0) as TJSONObject; 
     JV2 := JO.Get(0).JsonValue; 
     Memo2.Lines.Add(JV2.Value); 
    end; 
    finally 
    JV.Free; 
    end; 
end; 
関連する問題