Sınıfın içindeki fildlara koşula göre değer göndermek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
kirve
Üye
Mesajlar: 64
Kayıt: 03 Nis 2008 12:40

Sınıfın içindeki fildlara koşula göre değer göndermek

Mesaj gönderen kirve »

Arkadaşlar merhaba

Kod: Tümünü seç

 type
    Tpersonel=class(Tobject)
        private
        public
          Fadi        :string;
          Fsoyad      :string;
          FdogumTarih :TDate;
          Fyas        :string;
     
    end;
sınıfım mevcut. bu sınıfın elemanlarına

Kod: Tümünü seç

              for Field in Cxt.GetType(Tper.ClassType).GetFields do
              begin
                    case   (AnsiIndexText(Field.Name,['Fadi','Fsoyad','FdogumTarih','Fyas'])) of
                      0    :begin Tper.Fadi   :=(TJSONPair(item).JsonValue.Value);  end;
                      1    :begin Tper.Fsoyad :=(TJSONPair(item).JsonValue.Value);  end;
                      2    :begin Tper.Fyas   :=(TJSONPair(item).JsonValue.Value);  end;
                      3    :begin Tper.Fyas   :=(TJSONPair(item).JsonValue.Value);  end;
                    end;

              end;

karşılaştırma yaparak erişiyorum ve değerleri atayabiliyorum.
amacım json türünden aldığım bir veriyi çözümleyerek sınıfın elemanlarına atamak. buraya kadar herşey güzel fakat bu projeyi büyütme aşamasına geldiğimde bu case ifadesinin içindeki veri bana sıkıntı yaratacak bunu daha kolay bir yöntemle çözme şansım varmıdır.
jsonmarshal ve tjsonconvertobject functionlarının üzerinde epey bir çalıştım ama tam anlamı ile çözemedim. kendim yazmak istedim. yardımlarınızı bekliyorum.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Sınıfın içindeki fildlara koşula göre değer göndermek

Mesaj gönderen SimaWB »

Delphi versiyonunuzu yazmamışsınız ama XE6 ve sonrasında REST.JSON uniti içinde ObjectToJsonString ve JsonToObject fonksiyonları var.
Kolayca bir sınıfı JSON'a çevirebilir yada tersine çevrim yapabilirsiniz.
There's no place like 127.0.0.1
Kullanıcı avatarı
bulutsuzluk_35
Üye
Mesajlar: 124
Kayıt: 06 Eki 2007 04:14
Konum: İzmir-Ankara-İstanbul-Antalya
İletişim:

Re: Sınıfın içindeki fildlara koşula göre değer göndermek

Mesaj gönderen bulutsuzluk_35 »

o item kısmına integer mı gelir bilmiyorum ama sanırım o iş çok zor değil

//tanımlamalar
str : string;
myval : TValue;
//

for Field in Cxt.GetType(Tper.ClassType).GetFields do
begin
str := (TJSONPair(field.name).JsonValue.Value);//item kısmına ben field.name yazdım.amaç o isimdeki pairin değerini str içine almak.
myval := field.GetValue(tper);
TValue.Make(@str,TypeInfo(string),myval);
//string için bir sıkıntı yok ama datetime için olur.ama classında bunu string tanımla sonra datetime a çevir.amaç döngü bozulmasın :)
Field.SetValue(tper,myval);
end;
Böylelikle case 'i ortadan kaldırırsın.
Umarım anlatabilmişimdir.

Kod: Tümünü seç

try
  try
    inc(Bilgi);
  except
    sabir;
  end;
finally
  inc(Mutluluk);
end;
kirve
Üye
Mesajlar: 64
Kayıt: 03 Nis 2008 12:40

Re: Sınıfın içindeki fildlara koşula göre değer göndermek

Mesaj gönderen kirve »

cevaplar için teşekkürler.
bulutsuzluk sizin çözüme benzer bir yol buldum sorunu çözdüm ama sizin yönteminizi uygulayıp sonucu burda bildiririm. bu arada sorunun çözüm functionu göndereyim belki işine yarayan bir arkadaşız olur.

Kod: Tümünü seç

function Tcevir.cevirTjson(Adta: TObject; Text: string): Boolean;
var
  jo:TJSONObject;
  jv:TJSONValue;
  i:Integer;
  jp:TJSONPair;
  ja: TJSONArray;
  item:TJSONValue;

  Cxt: TRttiContext;
  Field:  TRttiField;

begin
    ja:=TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(UTF8Encode(Text)),0) as TJSONArray; //Json veriyi Json array çeviriyorum

    Cxt:=TRttiContext.Create;
    Field:=TRttiField.Create;
    try

      try
        for jv in ja do //json value değerleri içerisinde döngü başlatıyorum
          begin

            for item  in  TJSONArray(jv) do //jsonvalu içerisindeki itemlere teker teker ulaşıyorum
              begin
                  for Field in Cxt.GetType(Adta.ClassType).GetFields do //sınıfımın içerisindeki değişkenlere ulaşıyorum
                  begin
                        Cxt.GetType(Adta.ClassType).GetField(TJSONPair(item).JsonString.Value).SetValue(Adta,(TJSONPair(item).JsonValue.Value)); //itemdan gelen alan dedgeri sınıfımın alan değerine gönderiyorum ve sınıfımın elemanlarına değerleri atmış oluyorum.
                  end;

              end;
          end;

          Result:=True;
      except
          Result:=False;
      end;

    finally
         Cxt.Free;
         Field.Free;
         ja.Free;
    end;
Cevapla