JSON Verileri XML formatına Çevirme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

JSON Verileri XML formatına Çevirme

Mesaj gönderen Okann »

Merhaba Arkadaşlar,

Bir servisten JSON formatında veri alıyorum. Bunu xml formatına dönüştürmek istiyorum.
Nasıl yapabilirim yardımcı olabilir misiniz?
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen ertank »

Merhaba, JSON örneği olmadan yardımcı olmak pek mümkün olmaz.
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen Okann »

Merhaba,

Örnek json formatı ve dönüştürmek istediğim xml formatı aşağıdaki linklerdedir.
İlginiz için teşekkür ederim.

http://dosya.co/x4pbnqomz723/sip.json.html
http://dosya.co/nfuy6ftwjhyf/sip.XML.html
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen ertank »

Merhaba,

Kullandığınız Delphi sürümünü belirtmemişsiniz. Aşağıdaki örnek Delphi 10.1 Update 2 ile çalışmaktadır.

Json okumak için tüm yapıyı tanımlamaya gerek olmayabilir. Ücretsiz olduğu, eski Delphi sürümlerinde de çalışabildiği için çözüm önerisini mORMot framework fonksiyonu yardımı ile veriyorum. Ancak siz kendi tercih ettiğiniz bir json çözümü kullanabilirsiniz.
https://synopse.info

Json okuma:

Kod: Tümünü seç

uses
  DateUtils,
  System.IOUtils,
  SynCommons; // Synopse mORMot framework unit

procedure TForm1.Button1Click(Sender: TObject);
var
  V: Variant;
  JsonString: RawUTF8;
  i: Integer;
  ADate: TDateTime;
begin
  JsonString := RawUTF8(TFile.ReadAllText(Edit1.Text));

  V := _JsonFast(JsonString);

  for i := 0 to V.Count-1 do
  begin
    Memo1.Lines.Add(V.orders._(0).Items._(i).Product.Name);
    Memo1.Lines.Add(V.orders._(0).LastActivityDate);
    ADate := ISO8601ToDate(V.orders._(0).LastActivityDate);
    Memo1.Lines.Add('DateTime değişken üzerinden: ' + FormatDateTime('yyy-mm-dd', ADate));
  end;
end;
Yukarıdaki şekilde okuduğunuz verileri aşağıdaki linkte gösterilen XML dosyası oluşturma kod örneğini inceleyerek istenilen formatta kaydetmeniz mümkün.
viewtopic.php?f=2&t=36475&p=196820#p196766

XML dosyasına yazılacak alanların JSON alanları ile birebir aynı olmamaları sebebi ile tam çalışır kod örneği vermek mümkün değil.
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen Okann »

Hocam teşekkür ederim.

Buradaki _JSONFAST nedir tam olarak.

Yönlendirdiğiniz siteden indirdiğim dosyalarda hatalar çıkıyor.
Siz düzgün çalışan pas dosyalarını paylaşabilir misiniz?
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen ertank »

JSON temel olarak belli bir yapıyı tek satır string değere çevirir (serialization) sizin göderdiğiniz örnekteki json da bu haldeki bir Json string.
Seri haldeki Json tekar orjinal yapıya geri çevrilir (de-serialize) bunun birden fazla yöntemi vardır. Delphi dilinde record veya class yapısı oluşturup içlerinde tanımlanmış değişkenlere değerler atanabilir. Veya benim verdiğim örnekte ise de-serialization işlemi bir variant değişken içine açılıyor.

Kısaca _JsonFast() fonksiyonu variant değişken içine json de-serialize etmek için kullanılır.

Ekte 3 dosya halinde uygulamayı gönderiyorum. Forum dosya boyutu limiti sebebi ile bölmem gerekti. Açmak için Winrar 5.0 veya sonrası bir sürüm kullanılması gerekli.

Synopse framework içinden sadece gerekli unitleri proje ile beraber ekledim.
Dosya ekleri
json to xml.part03.rar
(101.25 KiB) 225 kere indirildi
json to xml.part02.rar
(199.26 KiB) 210 kere indirildi
json to xml.part01.rar
(199.18 KiB) 219 kere indirildi
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen Okann »

Merhaba Hocam çok teşekkür ederim.

Küçük bir şey daha sormak istiyorum. Aşağıdaki gibi direkt olarak json veriyi memoya yazdırıyorum. Normalde bir dosya almıyorum.
Direkt olarak stringi çekiyorum önüme.

memo1.Lines.Text := RestRequest1.Response.Content; // buraya verinin tamamı geliyor.

Fakat

V := _JsonFast(RestRequest1.Response.JSONText); veya
V := _JsonFast(RestRequest1.Response.Content);

ile verilerin tamamı memoya gelmiyor. items alanında 2 kayıt varken tek kayıt gösteriyor.
Bunun sebebini nasıl yorumlarsınız?
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen ertank »

Örnek kod ve gelen json bilgisini paylaşabilir misiniz?
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen Okann »

Hocam Merhaba,

Ben sizin gönderdiğiniz örnek üzerinde çalışıyorum şu an tamamen.
Çünkü öğrenme aşamasındayım.

Aşağıdaki gibi json veriyi memoya tam içeriğiyle çekiyorum yani size gönderdiğim sip.json formatındakinin aynısını alıyorum.
Çünkü siz dosya isteyince ben memoya dönen sonucu json olarak kaydedip verdim.

//Memo1.Lines.Text := Request.Response.Content

Kod: Tümünü seç

uses
  DateUtils,
  System.IOUtils,
  SynCommons,REST.Types;

procedure TForm1.Button1Click(Sender: TObject);
var
  V: Variant;
  JsonString: RawUTF8;
  i: Integer;
begin
  ResetRESTComponents;
  Client.Authenticator := BasicAuthenticator;
  BasicAuthenticator.Username := 'okan@*****.com.tr';
  BasicAuthenticator.Password := '******';

  Client.BaseURL := 'https://api.*****/Orders/';
  Request.Method := TRESTRequestMethod.rmGET;
  Request.Resource := '?Id=0&page=1&pageSize=1';
  Request.Execute;
  Memo1.Lines.Text := Request.Response.Content;  // Burada dönen veriyi .json olarak kaydedip paylaştım sizinle

  JsonString := RawUTF8(TFile.ReadAllText(Edit1.Text));

  V := _JsonFast(JsonString);

  for i := 0 to V.Count-1 do
  begin
    Memo2.Lines.Add(V.orders._(0).Items._(i).Product.Name);
    Memo2.Lines.Add(V.orders._(0).LastActivityDate);
    Memo2.Lines.Add('DateTime değişken üzerinden: ' + DateTimeToStr(ISO8601ToDate(V.orders._(0).LastActivityDate)));
  end;

end;

procedure TForm1.ResetRESTComponents;
begin
  Request.ResetToDefaults;
  Response.ResetToDefaults;
  Client.ResetToDefaults;
  Memo1.Clear;
end;
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen ertank »

Kodun ilgili bölümlerini aşağıdaki şekilde değiştirebilir misiniz?

Kod: Tümünü seç

  Request.Execute;

  JsonString := RawUTF8(Request.Response.Content);

  V := _JsonFast(JsonString);
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen Okann »

Bu şekilde denemiştim hocam. Sadece 1 satır getiriyor.
Ama dosyadan okuma yönteminiz ile bütün satırlar geliyor.
Yani dosyadan okumak ile gelen stringi okumak arasında ne fark olabilir ki?
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen Okann »

for i := 0 to V.Count-1 do

hocam burada v.count 1 dönüyor. Sipariş 1 tane olduğundan 1 kez dönmesi normal
bizim için önemli olan siparişin içinde product kaç kez dönüyor bunu bilmek.
O yüzden 1 satır getiriyor önümüze. Product alanının kaç kez döndüğünü öğrenebilir miyiz peki?
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen ertank »

Okann yazdı:Bu şekilde denemiştim hocam. Sadece 1 satır getiriyor.
Ama dosyadan okuma yönteminiz ile bütün satırlar geliyor.
Yani dosyadan okumak ile gelen stringi okumak arasında ne fark olabilir ki?
Dosyadan okuma işlemi benim servis üzerinden bilgi almam mümkün olmadığı için yapılan bir işlem idi. Sizin gelen json bilgisini dosya içine kaydetmeniz gerekmez hatta yapmamanızı tavsiye ederim.
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen ertank »

Okann yazdı:for i := 0 to V.Count-1 do

hocam burada v.count 1 dönüyor. Sipariş 1 tane olduğundan 1 kez dönmesi normal
bizim için önemli olan siparişin içinde product kaç kez dönüyor bunu bilmek.
O yüzden 1 satır getiriyor önümüze. Product alanının kaç kez döndüğünü öğrenebilir miyiz peki?
Yukarıda örnek olarak paylaştığınız Json içinde en başta gönderilen Count değerinin sipariş içindeki ürün adedi olduğunu varsaydım. Eğer bu sipariş adedi ise bana göndermiş olduğunuz örnekte 2 adet sipariş olması gerekli. Ben kendi adıma ikinci bir sipariş göremiyorum.
Okann
Üye
Mesajlar: 81
Kayıt: 09 Tem 2010 02:55

Re: JSON Verileri XML formatına Çevirme

Mesaj gönderen Okann »

Hocam örnekte 1 sipariş var. Siparişin içinde 2 kalem ürün var yani 2 satırlı bir sipariş örneği bu.
Siparişleri önüme her zaman 1 er tane çekcem. içinde sınırsız satır olabilir.
Ben bu satırların değerlerine ulaşamaz mıyım?
Daha önceden gönderdiğim xml örneğindeki Transaction satırlarına alacağım bu değerleri.
Items alanının dışında kalan değerleri ise transaction dışındaki fiş geneline hitap eden alanlara alacağım. Master-Detail yapısı yani.
Cevapla