كيفية تفسير نص json
#1
السلام عليكم ورحمة الله وبركاته


صيغة JSON (JavaScript Object Notation)

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

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

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


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

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

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


الملفات المرفقة
.rar   testJSON.rar (الحجم : 27.69 ك ب / التحميلات : 35)
وإن تقدم ذو تقوى بصالحةٍ *** قدمتُ بين يديه عبرة الندمِ
الرد
#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; 
الرد
#3
السلام عليكم ورحمة الله وبركاته

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

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

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


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

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

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


والله والموفق .
وإن تقدم ذو تقوى بصالحةٍ *** قدمتُ بين يديه عبرة الندمِ
الرد


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


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