delphi4arab منتديات دلفي للعرب

نسخة كاملة : كيفية تفسير نص json
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله وبركاته


صيغة JSON (JavaScript Object Notation)

صيغة ممتازة لتناقل البيانات وتخزينها مع الاحتفاظ على إمكانية قراءتها من الناس .

عندي الآن نص لتفسيره :

أستخدم superobject.PAS
من الموقع :
كود :
http://www.progdigy.com/?page_id=6


وهو في الحقية ممتاز ولم تظهر لي مشاكل مثل المكونات الأخرى، ولكن الآن لا أستطيع تفسير النص به.

المشروع الخاص بهذه النقطة في المرفقات كتبته على DELPHI 2010

طبعاً أنا جربت أكثر الاحتمالات التي رأيت بفهمي القاصر أنها تؤثر على الحل ولكن لا جدوى.
السلام عليكم

آسف ليس لدي خبرة في التعامل مع صيغة JSON، إلا اني قمت ببعض التعديل على برنامجك المرفق، واشتغل مع بعد التعديل باستخدام دلفي 6.

أولا: لنعيد صياغة البيانات كالتالي:

PHP كود :
[ 
  {  
"name":"اولي/01",
     
"gradeid":"10",
     
"limit":"1"
  
},
  {  
"name":"اولي/02",
     
"gradeid":"20",
     
"limit":"2"
  
},
  {  
"name":"اولي/03",
     
"gradeid":"30",
     
"limit":"2"
  
},
  {  
"name":"اولي/04",
     
"gradeid":"40",
     
"limit":"2"
  
},
  {  
"name":"اولي/05",
     
"gradeid":"50",
     
"limit":"2"
  
},
  {  
"name":"اولي/06",
     
"gradeid":"60",
     
"limit":"2"
  
}
 ] 

ونحفظها باسم : ansi.json

التعريفات الأولى كالتالي:


PHP كود :
type

  TStudent 
= record
    name
: String[20];
    
gradeid: shortInt;
    
limit: shortInt;
  
end;

  
TStudentList = array of TStudent;

  
TForm1 = class(TForm)
    
Memo1: TMemo;
    
Button1: TButton;
    
Memo2: TMemo;
    
Button2: TButton;
    
Button3: TButton;
    
Button4: TButton;
    
btRead: TButton;
    
btWrite: TButton;
    
procedure Button1Click(Sender: TObject);
    
procedure Button2Click(Sender: TObject);
    
procedure Button3Click(Sender: TObject);
    
procedure Button4Click(Sender: TObject);
    
procedure btReadClick(Sender: TObject);
    
procedure btWriteClick(Sender: TObject);
  private
    
StudentList: TStudentList;
    
procedure ReadFile(const FileName: String);
    
procedure SaveFile(StudentList: TStudentList; const FileName: String);
  public
  
end; 

تم إجرائية قراءة الملف:

PHP كود :
procedure TForm1.btReadClick(Sender: TObject);
begin
  readfile
('Ansi.json');
end;

procedure TForm1.ReadFile(const fileName : String);
var
  
i: integer;
  
obj: ISuperObject;
  
item: TSuperTableString;
  
objArray: TSuperArray;
  
Text: String;
begin
  
if FileExists(fileName) Then
  begin
    SetLength
(StudentList, 0);
    try
      
Text := fileAsText(fileName);

      if 
trim(Text) = '' then
        
exit;
      
Memo1.Clear;
      
Memo1.Lines.Add(Text);

      
obj := SO(Text);
      if 
obj = nil then
      begin
        Memo2
.Clear;
        
Memo2.Lines.Add('ISuperObject = nil');
        exit;
      
end;

      
objArray := obj.AsArray;
      if 
objArray = nil then
      begin
        Memo2
.Clear;
        
Memo2.Lines.Add('List = 0');
        exit;
      
end;


      
SetLength(StudentList, objArray.Length);
      for 
i := 0 to objArray.Length - 1 do
      
begin
        item 
:= objArray[i].AsObject;
        
StudentList[i].name := item['name'].AsString;
        
StudentList[i].gradeid := item['gradeid'].AsInteger;
        
StudentList[i].limit := item['limit'].AsInteger;

        
Memo2.Lines.Add('Name: ' + StudentList[i].name);
        
Memo2.Lines.Add('gradeid: ' + IntToStr(StudentList[i].gradeid));
        
Memo2.Lines.Add('limit: ' + IntToStr(StudentList[i].limit));
      
end;

    finally

    
end;
  
end;
end; 

و إجرائية حفظ الملف باسم آخر، واستبدال ":" بـ "=" عند صياغة البنود :


PHP كود :
procedure TForm1.btWriteClick(Sender: TObject);
begin
  SaveFile
(StudentList, 'Ansi2.json');
end;

procedure TForm1.SaveFile(StudentList: TStudentList; const FileName: String);
var
  
Student: TStudent;
  
i: integer;
  
j: integer;
  
cnt: integer;
  
s, rec: String;
begin
  
if Length(StudentList) = 0 then
    
exit;
  try
    
s := '[';
    
i := 0;
    
cnt := Length(StudentList);
    for 
j := 0 to cnt-1 do
    
//for Student in StudentList do
    
begin
      Student 
:= TStudent(StudentList[j]);
      if 
i > 0 then
        s 
:= s + ',';
      
rec := '{"name":"' + Student.name + '",';
      
rec := rec + '"gradeid":"' + IntToStr(Student.gradeid) + '",';
      
rec := rec + '"limit":"' + IntToStr(Student.limit) + '"}';

      
S := s + rec;
      
inc(i)
    
end;
    
s := s + ']';
  finally
  
end;
  
textAsFile(s, FileName);

end; 

نظرا لتشغيلي للبرنامج على دلفي 6 وليس دلفي 2010، بغض التغييرات قد تمت أهمها:
استبدال: for Student in StudentList do بما يؤدي عملها

وقف محددات الكومبايلر في الإجرائية : TSuperAvlEntry.Hash
في ملف المكتبة: unit superobject كالتالي:

PHP كود :
class function TSuperAvlEntry.Hash(const k: SOString): Cardinal;
var
  
h: cardinal;
  
i: Integer;
begin
  h 
:= 0;
//{$Q-}  // shag
  
for i := 1 to Length(k) do
    
h := h*129 + ord(k[i]) + $9e370001;
//{$Q+}
  
Result := h;
end; 
السلام عليكم ورحمة الله وبركاته

ما شاء الله عليك يا أستاذ خالد وفّيت وكفّيت

أنا كنت أستخدم نفس الـ ISuperObject في تفسير نص JSON ولكني توقفت عن البرمجة به لمدة أسبوعين فنسيت كيفية صياغة JSON فوضعت = موضع : فوقع الخطأ غير المتوقع فجربت أشياء كثيرة ولم تنفع .

والذي يفهم البرمجة بالجافاسيكريبت يعرف كيف يصاغ الكائن فيها، و JSON هي مجرد كائن جافا سيكربت بين علامتين تنصين ' ' .


أنا أهيب بالأخوة استخدام JSON ففيها فوائد كثيرة للمبرمج.

وهذا الموقع يشرح كيفية استخدام الوحدة superObject.pas

كود :
http://code.google.com/p/superobject/wiki/first_steps


والله والموفق .