Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
String'e çevrilmiş Stream Veri JsontoDataSet Dönüştürme Sorunu.
#1
Merhaba,

JSON olarak gönderdiğim veri içindeki alanlardan birisi stream veri içeriyor. (Stream veriyi string'e çeviriyorum) Client tarafta gönderdiğim JSON verisinin server tarafına string'e çevirdiğim stream veride dahil doğru geldiğini gözlemliyorum JSON'u dataset'e dönüştürürken sanırım string'e dönüştürülmüş stream veri içerisindeki 'üst tırnak' ifadelerinden dolayı veri eksik şekilde tabloya dönüşüyor. String'e çevrilmiş stream veri içeren içerisinde 3-5 farklı alanında olduğu json bilgisini tabloya nasıl doğru şekilde dönüştürebilirim bu konuda nasıl ilerlemeliyim.

Gönderdiğim JSON veri aşağıdaki şekilde dataset'e dönüştürüyorum

Teşekkürler.

procedure JsonToDataset(aDataset: TDataset; aJSON: string);
var
 JObj: TJSONArray;
 vConv: TCustomJSONDataSetAdapter;
begin
 if (aJSON = EmptyStr) then
 begin
   Exit;
 end;

 JObj := TJSONObject.ParseJSONValue(aJSON) as TJSONArray;
 vConv := TCustomJSONDataSetAdapter.Create(Nil);

 try
   vConv.DataSet := aDataset;
   vConv.UpdateDataSet(JObj);
 finally
   vConv.Free;
   JObj.Free;
 end;

end;
Cevapla
#2
Merhaba,

JSON verisinin server tarafına eksik geldiğini farkettim, client tarafında json gönderiken aşağıdaki gibi tanımlıyorum StreamStringDegiskeni'ni bir memo nesnesine yapıştırdığımda 10 bin karakter varken aşağıdaki JSON değişkenine 6.000 civarı bir karakter geliyor. (StreamString: string; )


var
 JSON: String;
begin

 JSON := '[{  "StreamString": "'+StreamStringDegiskeni+'",  "Sifre": "1" }]';

 Dm.RESTRequest1.Params.AddItem('Islemler', JSON,
   TRESTRequestParameterKind.pkREQUESTBODY);

 Dm.RESTRequest1.Execute;

Delphi Debug mode ile baktığımdan karakter sayısı eksik gözüküyor olabilir çözemedim sorunu bir türlü.

Bu konuda aslında tam soru şu oluyor; EncodeBase64 tipine çevirdiğim bir veriyi JSON ile server tarafına nasıl gönderebilirim. Bi bakımdan bir resim veya dosyayı json ile nasıl gönderebilirim.

Teşekkürler.
Cevapla
#3
Server tarafına sadece Base64 veriyi gönderdiğimde istediğim işlem sorunsuz oluyor, fakat Base64 verisi haricinde birkaç json bilgisini daha eklemem gerekiyor bu eklediğimde olmuyor. (Base64 bilgisini gönderirken aslında yine json olaran göndermiyorum sadece base64 veriyi gönderiyorum JSON olarak göndermem gerekiyor.)
Cevapla
#4
Veriyi json a dönüştürürken json.ToString mi kullanılıyor. Bu durum problem çıkarıyor olabilir. Aslında json.ToJSon kullanmakta fayda var.
Cevapla
#5
(06-03-2020, Saat: 08:55)sabanakman Adlı Kullanıcıdan Alıntı: Veriyi json a dönüştürürken json.ToString mi kullanılıyor. Bu durum problem çıkarıyor olabilir. Aslında json.ToJSon kullanmakta fayda var.


Gönderdiğim JSON'u string bir değişken olarak gönderiyorum.
var
 JSON: String;
begin

JSON := '[{  "StreamString": "'+StreamStringDegiskeni+'",  "Sifre": "1" }]';

Dm.RESTRequest1.Params.AddItem('Islemler', JSON,
  TRESTRequestParameterKind.pkREQUESTBODY);

Dm.RESTRequest1.Execute;
Cevapla
#6
(05-03-2020, Saat: 23:49)pro_imaj Adlı Kullanıcıdan Alıntı: Server tarafına sadece Base64 veriyi gönderdiğimde istediğim işlem sorunsuz oluyor, fakat Base64 verisi haricinde birkaç json bilgisini daha eklemem gerekiyor bu eklediğimde olmuyor. (Base64 bilgisini gönderirken aslında yine json olaran göndermiyorum sadece base64 veriyi gönderiyorum JSON olarak göndermem gerekiyor.)

Merhaba,
JSON veriniz aşağıdaki gibi olabilir. 
{
 "Base64IcerenBirOzellik":[
    {
      "IslemId":1,
      "Baslik":"Araba - 1",
      "Dosya":"PCFkb2N0DelphiCaneXBlIGh0bWw+PfGh0bWw+PGhlYWQ=..."
    },
    {
      "IslemId":2,
      "Baslik":"Araba - 2",
      "Dosya":"PCFkb2DelphiCanN0eXBlIGh0bWw+PGh0fgdabWw+PGhlY..."
    },
    {
      "IslemId":3,
      "Baslik":"Araba - 3",
      "Dosya":"PCFkb2N0eXBlIGh0bWw+PGh0bDelphiCanWw+PGhlYWQ+...."
    },
    {
      "IslemId":4,
      "Baslik":"Araba - 4",
      "Dosya":"PCFkb2N0eXDelphiCanBlIGh0bWw+PGh0bWw+PGhlYWQ+PH..."
    }
  ]
}

Tek bir resim ve yanında ek bilgi gönderecek iseniz aşağıdaki gibi olabilir.
{
  "Base64IcerenBirOzellik":{
     "IslemId":1,
     "Baslik":"Araba - 1",
     "Dosya":"PCFkb2N0DelphiCaneXBlIGh0bWw+PfGh0bWw+PGhlYWQ=..."
  }
}

Dosya alanında yalnızca resim değil, herhangi bir binary dosyayı gönderip, alabilirsiniz.
Resmi göndereceğiniz uygulamada (örn. sunucu), dosyayı bir stream'a alıp base64 stringe dönüştürmeniz gerekiyor. Daha sonra yukarıda yapısını vermiş olduğum JSON'a dönüştürürsünüz. 
Base64 string'i alıp, resme dönüştürecek uygulamada (örn. mobil) tarafında, JSON içerisindeki string veriyi okuyup, bunu base64 formatından resim formatına dönüştürebilirsiniz.

Aşağıdaki iki metod yapacağınız base64 dönüşümlerinde size yardımcı olacaktır.
procedure Base64ToImage(const Base64Str: string; const Image: TBitmap);
var
 streamIn: TStringStream;
 streamOut: TBytesStream;
begin
 streamIn := TStringStream.Create(Base64Str);
 try
   streamIn.Position := 0;
   streamOut := TBytesStream.Create;
   try
     TNetEncoding.Base64.Decode(streamIn, streamOut);
     streamOut.Position := 0;
     Image.LoadFromStream(streamOut);
   finally
     streamOut.Free;
   end;
 finally
   streamIn.Free;
 end;
end;
function ImageToBase64(const Image: TBitmap): string;
var
  stremIn: TBytesStream;
  streamOut: TStringStream;
begin
  Result := '';
  if Image.IsEmpty then
    Exit;
  stremIn := TBytesStream.Create;
  try
    Image.SaveToStream(stremIn);
    stremIn.Position := 0;
    streamOut := TStringStream.Create('');
    try
      TNetEncoding.Base64.Encode(stremIn, streamOut);
      Result := streamOut.DataString;
    finally
      streamOut.Free;
    end;
  finally
    stremIn.Free;
  end;
end;
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#7
(06-03-2020, Saat: 09:12)Fesih ARSLAN Adlı Kullanıcıdan Alıntı:
(05-03-2020, Saat: 23:49)pro_imaj Adlı Kullanıcıdan Alıntı: Server tarafına sadece Base64 veriyi gönderdiğimde istediğim işlem sorunsuz oluyor, fakat Base64 verisi haricinde birkaç json bilgisini daha eklemem gerekiyor bu eklediğimde olmuyor. (Base64 bilgisini gönderirken aslında yine json olaran göndermiyorum sadece base64 veriyi gönderiyorum JSON olarak göndermem gerekiyor.)

Merhaba,

Tek bir resim ve yanında ek bilgi gönderecek iseniz aşağıdaki gibi olabilir.
{
   "Base64IcerenBirOzellik":{
     "IslemId":1,
     "Baslik":"Araba - 1",
     "Dosya":"PCFkb2N0DelphiCaneXBlIGh0bWw+PfGh0bWw+PGhlYWQ=..."
  }
}

Hocam merhaba,

Sorun bunun server tarafında okunamamasından kaynaklanıyor, yani yukarıdaki yazdığınız gönderdiğiniz Json verisi Server tarafına  Request.Content ile geliyor burada Dosya alanına nasıl ulaşabiliriz.
Cevapla
#8
(06-03-2020, Saat: 09:19)pro_imaj Adlı Kullanıcıdan Alıntı:
(06-03-2020, Saat: 09:12)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Merhaba,

Tek bir resim ve yanında ek bilgi gönderecek iseniz aşağıdaki gibi olabilir.
{
   "Base64IcerenBirOzellik":{
     "IslemId":1,
     "Baslik":"Araba - 1",
     "Dosya":"PCFkb2N0DelphiCaneXBlIGh0bWw+PfGh0bWw+PGhlYWQ=..."
  }
}

Hocam merhaba,

Sorun bunun server tarafında okunamamasından kaynaklanıyor, yani yukarıdaki yazdığınız gönderdiğiniz Json verisi Server tarafına  Request.Content ile geliyor burada Dosya alanına nasıl ulaşabiliriz.

Bildiğimiz klasik JSON çözümleme ile yapabilirsiniz.
var
  jsonObj: TJsonObject;
 const
  strJSON=
  '{'+
  '  "Base64IcerenBirOzellik":'+
  '    {'+
  '      "IslemId":1,'+
  '      "Baslik":"Araba - 1",'+
  '      "Dosya":"PCFkb2N0DelphiCaneXBlIGh0bWw+PfGh0bWw+PGhlYWQ=..."'+
  '    }'+
  '}';
begin
 jsonObj := TJsonObject.ParseJSONValue(TEncoding.UTF8.GetBytes(strJSON), 0) as TJsonObject;
 ShowMessage(jsonObj.GetValue('Base64IcerenBirOzellik').P['Dosya'].Value);
end;
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#9
(06-03-2020, Saat: 09:03)pro_imaj Adlı Kullanıcıdan Alıntı:
(06-03-2020, Saat: 08:55)sabanakman Adlı Kullanıcıdan Alıntı: Veriyi json a dönüştürürken json.ToString mi kullanılıyor. Bu durum problem çıkarıyor olabilir. Aslında json.ToJSon kullanmakta fayda var.


Gönderdiğim JSON'u string bir değişken olarak gönderiyorum.
var
 JSON: String;
begin

JSON := '[{  "StreamString": "'+StreamStringDegiskeni+'",  "Sifre": "1" }]';

Dm.RESTRequest1.Params.AddItem('Islemler', JSON,
  TRESTRequestParameterKind.pkREQUESTBODY);

Dm.RESTRequest1.Execute;

Yukarıdaki JSON veriyi aşağıdaki gibi çözümleyebilirsiniz.
var
  jsonArr: TJSONArray;
const
 strJSON = '[{  "StreamString": "BirDeğer",  "Sifre": "1" }]';
begin
 jsonArr := TJsonObject.ParseJSONValue(TEncoding.UTF8.GetBytes(strJSON), 0) as TJSONArray;
 ShowMessage(jsonArr.GetValue<String>('[0].StreamString'));
end;
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#10
(06-03-2020, Saat: 09:56)Fesih ARSLAN Adlı Kullanıcıdan Alıntı:
(06-03-2020, Saat: 09:03)pro_imaj Adlı Kullanıcıdan Alıntı: Gönderdiğim JSON'u string bir değişken olarak gönderiyorum.
var
 JSON: String;
begin

JSON := '[{  "StreamString": "'+StreamStringDegiskeni+'",  "Sifre": "1" }]';

Dm.RESTRequest1.Params.AddItem('Islemler', JSON,
  TRESTRequestParameterKind.pkREQUESTBODY);

Dm.RESTRequest1.Execute;

Yukarıdaki JSON veriyi aşağıdaki gibi çözümleyebilirsiniz.
var
  jsonArr: TJSONArray;
const
 strJSON = '[{  "StreamString": "BirDeğer",  "Sifre": "1" }]';
begin
 jsonArr := TJsonObject.ParseJSONValue(TEncoding.UTF8.GetBytes(strJSON), 0) as TJSONArray;
 ShowMessage(jsonArr.GetValue<String>('[0].StreamString'));
end;

Hocam çok teşekkür ederim konuyu bu şekilde çözdüm.

JSON yazma okuma konularıyla ilgili çok örnek yapmak gerekiyor dünden bu güne bu sorunu çözememiştim.

İyi çalışmalar.

(06-03-2020, Saat: 09:12)Fesih ARSLAN Adlı Kullanıcıdan Alıntı:
(05-03-2020, Saat: 23:49)pro_imaj Adlı Kullanıcıdan Alıntı: Server tarafına sadece Base64 veriyi gönderdiğimde istediğim işlem sorunsuz oluyor, fakat Base64 verisi haricinde birkaç json bilgisini daha eklemem gerekiyor bu eklediğimde olmuyor. (Base64 bilgisini gönderirken aslında yine json olaran göndermiyorum sadece base64 veriyi gönderiyorum JSON olarak göndermem gerekiyor.)

Merhaba,
JSON veriniz aşağıdaki gibi olabilir. 
{
 "Base64IcerenBirOzellik":[
    {
      "IslemId":1,
      "Baslik":"Araba - 1",
      "Dosya":"PCFkb2N0DelphiCaneXBlIGh0bWw+PfGh0bWw+PGhlYWQ=..."
    },
    {
      "IslemId":2,
      "Baslik":"Araba - 2",
      "Dosya":"PCFkb2DelphiCanN0eXBlIGh0bWw+PGh0fgdabWw+PGhlY..."
    },
    {
      "IslemId":3,
      "Baslik":"Araba - 3",
      "Dosya":"PCFkb2N0eXBlIGh0bWw+PGh0bDelphiCanWw+PGhlYWQ+...."
    },
    {
      "IslemId":4,
      "Baslik":"Araba - 4",
      "Dosya":"PCFkb2N0eXDelphiCanBlIGh0bWw+PGh0bWw+PGhlYWQ+PH..."
    }
  ]
}

Tek bir resim ve yanında ek bilgi gönderecek iseniz aşağıdaki gibi olabilir.
{
  "Base64IcerenBirOzellik":{
     "IslemId":1,
     "Baslik":"Araba - 1",
     "Dosya":"PCFkb2N0DelphiCaneXBlIGh0bWw+PfGh0bWw+PGhlYWQ=..."
  }
}

Dosya alanında yalnızca resim değil, herhangi bir binary dosyayı gönderip, alabilirsiniz.
Resmi göndereceğiniz uygulamada (örn. sunucu), dosyayı bir stream'a alıp base64 stringe dönüştürmeniz gerekiyor. Daha sonra yukarıda yapısını vermiş olduğum JSON'a dönüştürürsünüz. 
Base64 string'i alıp, resme dönüştürecek uygulamada (örn. mobil) tarafında, JSON içerisindeki string veriyi okuyup, bunu base64 formatından resim formatına dönüştürebilirsiniz.

Aşağıdaki iki metod yapacağınız base64 dönüşümlerinde size yardımcı olacaktır.
procedure Base64ToImage(const Base64Str: string; const Image: TBitmap);
var
 streamIn: TStringStream;
 streamOut: TBytesStream;
begin
 streamIn := TStringStream.Create(Base64Str);
 try
   streamIn.Position := 0;
   streamOut := TBytesStream.Create;
   try
     TNetEncoding.Base64.Decode(streamIn, streamOut);
     streamOut.Position := 0;
     Image.LoadFromStream(streamOut);
   finally
     streamOut.Free;
   end;
 finally
   streamIn.Free;
 end;
end;
function ImageToBase64(const Image: TBitmap): string;
var
  stremIn: TBytesStream;
  streamOut: TStringStream;
begin
  Result := '';
  if Image.IsEmpty then
    Exit;
  stremIn := TBytesStream.Create;
  try
    Image.SaveToStream(stremIn);
    stremIn.Position := 0;
    streamOut := TStringStream.Create('');
    try
      TNetEncoding.Base64.Encode(stremIn, streamOut);
      Result := streamOut.DataString;
    finally
      streamOut.Free;
    end;
  finally
    stremIn.Free;
  end;
end;

*Ek bilgi olarak yukarıdaki Base64ToImage, ImageToBase64  işlemler aşağıdaki şekilde daha az kod ile yapılabilir.
StreamString :=  EncodeBase64(stream.Memory, stream.Size);
Stream := TBytesStream.Create(DecodeBase64(base64));
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  TIdTCPServer'dan seçili client'a veri gönderme [çözüldü] Yasemin 12 488 24-11-2020, Saat: 09:27
Son Yorum: pro_imaj
  Qreport dan pdf e dönüştürme noname101 14 514 16-11-2020, Saat: 11:42
Son Yorum: noname101
  Excel Veri Okuma Yöntemi Tercihiniz Nedir? pro_imaj 12 375 11-11-2020, Saat: 22:14
Son Yorum: anemos
  StringList Yavaşlığı ve Güncelleme Sorunu bnyamin86 2 132 11-11-2020, Saat: 11:27
Son Yorum: ozcanm
  String diziyi Json Veriye Dönüştürme - Çözüldü KarahanMesut 10 315 10-11-2020, Saat: 20:33
Son Yorum: pro_imaj



Konuyu Okuyanlar: 1 Ziyaretçi