كيفية تفسير نص json
#2
السلام عليكم

آسف ليس لدي خبرة في التعامل مع صيغة 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 - بواسطة shagrouni - 19-07-2010, 11:43 PM

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم