Json veri okumada doğru yöntem

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Json veri okumada doğru yöntem

Mesaj gönderen Lord_Ares »

Merhaba , json veri okumam gerekiyor. Fakat gördüğüm kadarıyla delphi json, superobject , Xsuperobject gibi bir çok yöntemi var. Mantığını anlamak öğrenmek için ( ezbere kopyala yapıştır sevmiyorum.. ) konu hakkında malesef türkçe kaynak bulamadım. Nasıl kullanılır, yukarıdaki yöntemlerden hangisini neden kullanmalıyız.
Teşekkürler
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Json veri okumada doğru yöntem

Mesaj gönderen ertank »

Merhaba, okumanız gereken Json örneği paylaşmanız mümkün müdür?
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Json veri okumada doğru yöntem

Mesaj gönderen Lord_Ares »

Amacım şu adreste https://poloniex.com/exchange#usdt_nxt sağ tarafta markets kısmında görülen paraların fiyatlarını sitenin apisini kullanaran almak.
Sitenin apisi hakkında bilgi : https://poloniex.com/support/api/

Burada Push , Private ve public method olarak üç api var. Ben siteye üye olarak public key ve secretcode alarak idhttp ile ilgili fiyatları alabileceğimi düşünmüştüm. Siz benden örnek bir json verisi isteyince farkettim ki (yada yanılıyorum) her api metodu farklı bir iş için kullanılmış. Dolayısı ile hangi metodu kullanacağımı şuan şaşırmış durumdayım. Sanırım fiyatları alabilmek için Push ve Public metodunu kullanmam gerekiyor.
Site Public metoduna örnek için şöyle bir Json çıktısı vermiş https://poloniex.com/public?command=returnTicker
Fakat bunun fiyatları döndürdüğünü sanmıyorum.. Ve kullanılan methoda göre sanırım dönen json çıktısı farklı oluyor.

İdhttp ile şu şekilde private api metodunu denedim. Gördüm ki parametre olarak ReturnBalance gönderirsem satın almış olduğum, elimdeki paraların miktarını gösteriyor. Fiyatları bu method ile okuyamam. Sanırım post yerine get kullanıp public metod kullanmalıyım. Pus api nedir ve kullanmak için WAMP protocol gerekliymiş o nedir bilmiyorum :D

Kod: Tümünü seç

//// uses IdGlobal, IdHashSHA,IdSSLOpenSSL,System.Hash ;

procedure TForm1.Button2Click(Sender: TObject);
var
 Parameters: TStringList;
 Rsp, sign: String;
 Secretcode:String;
begin
 Parameters := TStringList.Create;
 try
   Secretcode:='adfdxxkfkkşadfa';
   Parameters.Add('nonce=35');
   Parameters.Add('command=returnBalances');

   Parameters.Delimiter := '&';
   sign := THashSHA2.GetHMAC(Parameters.DelimitedText, Secretcode, THashSHA2.TSHA2Version.SHA512);

   IdHTTP1.Request.CustomHeaders.Values['Key'] := 'xxxxxxxxxxxxx';
   IdHTTP1.Request.CustomHeaders.Values['Sign'] := sign;
   Rsp := IdHTTP1.Post('https://poloniex.com/tradingApi', Parameters);

 finally
   Parameters.Free;
   Form1.Memo1.Lines.Add(rsp);
 end;
end;

Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Json veri okumada doğru yöntem

Mesaj gönderen Lord_Ares »

İdhttp.get ile şuradan dönen bilgileri parse etmek istiyorum.
https://poloniex.com/public?command=returnTicker
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Json veri okumada doğru yöntem

Mesaj gönderen ertank »

Merhaba,

İlgili site sadece HTTP GET ile işlem yaptığını gönderdiğiniz bağlantılarda açıklamış.
https://poloniex.com/support/api/

Kod: Tümünü seç

There are six public methods, all of which take HTTP GET requests and return output in JSON format:
Json formatı ile çalışmak her zaman kolay olmayabiliyor. Özellikle verdiğiniz örnek çok gereksiz yere kod yazılmasına sebep olacak bir örnek. Delphi standart json rutinleri dışında superobject, mORMot gibi farklı json çözümleri mevcut. Ben şahsen json konusunda mORMot yaklaşımını tercih ediyorum.
https://synopse.info/files/mORMotNightlyBuild.zip

mORMot framework geriye dönük olarak Delphi 7 dahil çalışabilir. Bu anlamda UTF8 desteğini kendi içinde tanımladığı RawUTF8 türünü kullanarak yapar. Ayrıca kendisinin daha hızlı yaptığına inandığı bazı standart fonksiyonları (Örn: Trim()) yine bu ünite içinde tanımlamıştır. Dolayısıyla, uygulamanızı derlediğiniz zaman "type conversion" uyarıları alır iseniz yüksek ihtimal ile RawUTF8 türü ile çalışan bir mORMot fonksiyonuna denk gelmişsiniz demektir. Delphi yazılan bir fonksiyon/prosedürü en son uses kısmında eklenen üniteden yukarıya doğru diğer üniteler içine arar. SynCommons unitesini en son olarak eklemeniz durumunda bu ünite içindeki Trim() derleme zamanında kullanılır.

İstediğiniz işlemi aşağıdaki kod ile yapmanız mümkün. Ancak okunan json verileri içinden hangi veri(ler) ile ilgilendiğinizi bilmediğim için sadece ilk veriyi memo alanına yazdırma kısmını örnek içinde gösteriyorum.
Json rutinlerine ulaşabilmek için yukarıdaki bağlantıyı indirdikten ve Library Search Path içine ekledikten sonra aşağıdaki üniteyi uses kısmına eklemeniz gerekli.

Kod: Tümünü seç

uses
  SynCommons;
mORMot record tabanlı bir json kütüphanesidir. Yani okumak/yazmak istediğiniz json bilgisini öncelikle bir record olarak tanımlamalısınız. Bunu sizin gönderdiğiniz json için aşağıdaki şekilde yapmak mümkün:

Kod: Tümünü seç

  TDetail = packed record
    id: Integer;
    last: string;
    lowestAsk: string;
    highestBid: string;
    percentChange: string;
    baseVolume: string;
    quoteVolume: string;
    isFrozen: string;
    high24hr: string;
    low24hr: string;
  end;

  TMain = packed record
    BTC_BCN,
    BTC_BELA,
    BTC_BLK,
    BTC_BTCD,
    BTC_BTM,
    BTC_BTS,
    BTC_BURST,
    BTC_CLAM,
    BTC_DASH,
    BTC_DGB,
    BTC_DOGE,
    BTC_EMC2,
    BTC_FLDC,
    BTC_FLO,
    BTC_GAME,
    BTC_GRC,
    BTC_HUC,
    BTC_LTC,
    BTC_MAID,
    BTC_OMNI,
    BTC_NAV,
    BTC_NEOS,
    BTC_NMC,
    BTC_NXT,
    BTC_PINK,
    BTC_POT,
    BTC_PPC,
    BTC_RIC,
    BTC_STR,
    BTC_SYS,
    BTC_VIA,
    BTC_XVC,
    BTC_VRC,
    BTC_VTC,
    BTC_XBC,
    BTC_XCP,
    BTC_XEM,
    BTC_XMR,
    BTC_XPM,
    BTC_XRP,
    USDT_BTC,
    USDT_DASH,
    USDT_LTC,
    USDT_NXT,
    USDT_STR,
    USDT_XMR,
    USDT_XRP,
    XMR_BCN,
    XMR_BLK,
    XMR_BTCD,
    XMR_DASH,
    XMR_LTC,
    XMR_MAID,
    XMR_NXT,
    BTC_ETH,
    USDT_ETH,
    BTC_SC,
    BTC_BCY,
    BTC_EXP,
    BTC_FCT,
    BTC_RADS,
    BTC_AMP,
    BTC_DCR,
    BTC_LSK,
    ETH_LSK,
    BTC_LBC,
    BTC_STEEM,
    ETH_STEEM,
    BTC_SBD,
    BTC_ETC,
    ETH_ETC,
    USDT_ETC,
    BTC_REP,
    USDT_REP,
    ETH_REP,
    BTC_ARDR,
    BTC_ZEC,
    ETH_ZEC,
    USDT_ZEC,
    XMR_ZEC,
    BTC_STRAT,
    BTC_NXC,
    BTC_PASC,
    BTC_GNT,
    ETH_GNT,
    BTC_GNO,
    ETH_GNO,
    BTC_BCH,
    ETH_BCH,
    USDT_BCH,
    BTC_ZRX,
    ETH_ZRX,
    BTC_CVC,
    ETH_CVC,
    BTC_OMG,
    ETH_OMG,
    BTC_GAS,
    ETH_GAS,
    BTC_STORJ: TDetail;
  end;
Record tanımında dikkat edileceği üzere "packed record" ifadesi kullanılmıştır. mORMot json rutinleri ile kullanılcak record tanımları "packed record" şeklinde olmalıdır.

Okunan json bilgisini record içine kopyalama işlemi aşağıdaki şekilde yapılabilir.

Kod: Tümünü seç

var
  Json: RawUTF8;
  ParsedValues: TMain;
  MS: TMemoryStream;
  TempString: string;
begin
  MS := TMemoryStream.Create();
  try
    IdHTTP1.Get('https://poloniex.com/public?command=returnTicker', MS);
    SetString(TempString, PAnsiChar(MS.Memory), MS.Size);
    Json := RawUTF8(TempString);
    if RecordLoadJSON(ParsedValues, Json, TypeInfo(TMain)) then
    begin
      Memo2.Lines.Clear();
      Memo2.Lines.Add(ParsedValues.BTC_BCN.id.ToString());
      Memo2.Lines.Add(ParsedValues.BTC_BCN.last);
      Memo2.Lines.Add(ParsedValues.BTC_BCN.lowestAsk);
      Memo2.Lines.Add(ParsedValues.BTC_BCN.highestBid);
      Memo2.Lines.Add(ParsedValues.BTC_BCN.percentChange);
      Memo2.Lines.Add(ParsedValues.BTC_BCN.baseVolume);
      Memo2.Lines.Add(ParsedValues.BTC_BCN.quoteVolume);
      Memo2.Lines.Add(ParsedValues.BTC_BCN.isFrozen);
      Memo2.Lines.Add(ParsedValues.BTC_BCN.high24hr);
      Memo2.Lines.Add(ParsedValues.BTC_BCN.low24hr);
    end
    else
    begin
      Memo2.Lines.Add('json parse failed');
    end;
  finally
    MS.Free();
  end;
end;
Çalışan örnek uygulama mesaja eklenmiştir. Derlenebilmesi için yukarıdaki bağlantıdan mORMot kütüphanesi indirilerek bilgisayarda uygun bir dizine açılmalı ve bu dizin Library search path içine eklenmelidir.

Son olarak, ilgili site json string bilgisi normal bir json. Bunun dışında "json array" olarak ifade edilen json bilgisi vardır. Array türündeki json bilgisi okumak için mROMot kütüphanesi içinde DynArrayLoadJSON() fonksiyonu kullanılmalıdır.
Dosya ekleri
json.7z
(5.94 KiB) 215 kere indirildi
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Json veri okumada doğru yöntem

Mesaj gönderen Lord_Ares »

Emeğine bilgine sağlık üstadım. Hemen indirip inceliyorum. Bize sunmuş olduğun yararların, öğretilerin, örneklerin hakkını ödeyemeyiz. İyiki varsın.
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Json veri okumada doğru yöntem

Mesaj gönderen Lord_Ares »

Sizin örneğinizden önce bende okuyup araştırdığım kadarıyla şöyle bir deneme yapmıştım fakat acces vialotion hatası aldım. Oda aklımın bir köşesine takıldı :)))

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var
  JsonCiktisi: string;
 JsonNesnesi: TJSONObject;

begin
 Form1.Memo1.Clear;
 
 try
   JsonCiktisi:= IdHTTP1.Get('https://poloniex.com/public?command=returnTicker');
 finally
 
 end;

   JsonNesnesi:=TJSONObject.ParseJSONValue(JsonCiktisi) as TJSONObject;
   Form1.Memo1.Lines.Add('IDsi : '+ JsonNesnesi.GetValue('lowestAsk').Value);

end;

Normalde aşağıdaki json çıktısına göre getvalue değerine lowestAsk veya id isimlerinden birini yazdığımda değer döndürmesi gerekmez mi ? Denediğimde Acces vialation hatası aldım. Ama value değerine BTC_BCN yazarsam boş değer dönüyor hata vermiyor :D Sanırım gözümden birşey kaçırdım.

Kod: Tümünü seç

"BTC_BCN": {
        "id": 7,
        "last": "0.00000078",
        "lowestAsk": "0.00000078",
        "highestBid": "0.00000077",
        "percentChange": "-0.10344827",
        "baseVolume": "499.69932673",
        "quoteVolume": "634711893.02904046",
        "isFrozen": "0",
        "high24hr": "0.00000088",
        "low24hr": "0.00000070"
    },
Sanırım sorun JsonNesnesi.GetValue('lowestAsk').Value kodundaki lowestAsk ismi.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Json veri okumada doğru yöntem

Mesaj gönderen ertank »

Lord_Ares yazdı: 11 Oca 2018 02:11 Sizin örneğinizden önce bende okuyup araştırdığım kadarıyla şöyle bir deneme yapmıştım fakat acces vialotion hatası aldım. Oda aklımın bir köşesine takıldı :)))

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var
  JsonCiktisi: string;
 JsonNesnesi: TJSONObject;

begin
 Form1.Memo1.Clear;
 
 try
   JsonCiktisi:= IdHTTP1.Get('https://poloniex.com/public?command=returnTicker');
 finally
 
 end;

   JsonNesnesi:=TJSONObject.ParseJSONValue(JsonCiktisi) as TJSONObject;
   Form1.Memo1.Lines.Add('IDsi : '+ JsonNesnesi.GetValue('lowestAsk').Value);

end;

Normalde aşağıdaki json çıktısına göre getvalue değerine lowestAsk veya id isimlerinden birini yazdığımda değer döndürmesi gerekmez mi ? Denediğimde Acces vialation hatası aldım. Ama value değerine BTC_BCN yazarsam boş değer dönüyor hata vermiyor :D Sanırım gözümden birşey kaçırdım.

Kod: Tümünü seç

"BTC_BCN": {
        "id": 7,
        "last": "0.00000078",
        "lowestAsk": "0.00000078",
        "highestBid": "0.00000077",
        "percentChange": "-0.10344827",
        "baseVolume": "499.69932673",
        "quoteVolume": "634711893.02904046",
        "isFrozen": "0",
        "high24hr": "0.00000088",
        "low24hr": "0.00000070"
    },
Sanırım sorun JsonNesnesi.GetValue('lowestAsk').Value kodundaki lowestAsk ismi.
Delphi XE6 sonrası kullanımı aşağıdaki gibidir.

Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
var
  TempString: string;
  JsonValue: TJsonValue;
begin
  TempString := IdHTTP1.Get('https://poloniex.com/public?command=returnTicker');
  JsonValue := TJSONObject.ParseJSONValue(TempString);
  try
    Memo2.Lines.Add('lowestAsk: ' + JsonValue.GetValue<string>('BTC_BCN.lowestAsk'));
  finally
    JsonValue.Free();
  end;
end;
mehkoc27
Üye
Mesajlar: 1
Kayıt: 10 Eki 2018 11:12

Re: Json veri okumada doğru yöntem

Mesaj gönderen mehkoc27 »

Merhaba ; Mormont u vermiş olduğun link ten indirdim.
Fakat XE5 e Kurulum Yapamadım. bir .dpk buldum. Fakat Kurulumda Hata Vrdi ?

Yardımcı Olursan Sevinirim.
Paylaşımlar için Teşekkürler.

İyi Günler.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Json veri okumada doğru yöntem

Mesaj gönderen ertank »

Merhaba,

mORMot bir bileşen seti değildir. Bir framework'tür. Kullanım için kendi ünitenizin uses kısımlarında ilgili mORMot ünitelerine atıfta bulunmalı ve ardından ilgili fonksiyonları kullanmalısınız.

Bunu dosyayı paylaştığım mesaj içinde aşağıdaki ifadeler ile anlatmaya çalışmıştım:
"Derlenebilmesi için yukarıdaki bağlantıdan mORMot kütüphanesi indirilerek bilgisayarda uygun bir dizine açılmalı ve bu dizin Library search path içine eklenmelidir."
Cevapla