Json veri okumada doğru yöntem
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Json veri okumada doğru yöntem
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
Teşekkürler
Re: Json veri okumada doğru yöntem
Merhaba, okumanız gereken Json örneği paylaşmanız mümkün müdür?
Re: Json veri okumada doğru yöntem
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
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
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;
Re: Json veri okumada doğru yöntem
İdhttp.get ile şuradan dönen bilgileri parse etmek istiyorum.
https://poloniex.com/public?command=returnTicker
https://poloniex.com/public?command=returnTicker
Re: Json veri okumada doğru yöntem
Merhaba,
İlgili site sadece HTTP GET ile işlem yaptığını gönderdiğiniz bağlantılarda açıklamış.
https://poloniex.com/support/api/
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.
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:
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.
Ç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.
İ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:
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;
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;
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;
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) 217 kere indirildi
Re: Json veri okumada doğru yöntem
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.
Re: Json veri okumada doğru yöntem
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ı ))
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 Sanırım gözümden birşey kaçırdım.
Sanırım sorun JsonNesnesi.GetValue('lowestAsk').Value kodundaki lowestAsk ismi.
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;
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"
},
Re: Json veri okumada doğru yöntem
Delphi XE6 sonrası kullanımı aşağıdaki gibidir.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ı ))
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 Sanırım gözümden birşey kaçırdım.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;
Sanırım sorun JsonNesnesi.GetValue('lowestAsk').Value kodundaki lowestAsk ismi.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" },
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;
Re: Json veri okumada doğru yöntem
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.
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.
Re: Json veri okumada doğru yöntem
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."
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."