delphi4arab منتديات دلفي للعرب
كيفية تفسير نص json - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : كيفية تفسير نص json (/showthread.php?tid=2193)



كيفية تفسير نص json - أبو محمد اللحياني - 16-07-2010

السلام عليكم ورحمة الله وبركاته


صيغة JSON (JavaScript Object Notation)

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

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

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


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

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

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


كيفية تفسير نص json - shagrouni - 19-07-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; 



كيفية تفسير نص json - أبو محمد اللحياني - 20-07-2010

السلام عليكم ورحمة الله وبركاته

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

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

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


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

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

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


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