2016-04-14 5 views
0

kullanarak geçerli JSON'u seri hale getiremiyor JSON biçimindeki veriler için bana üreten bir kod (dinlenme sunucusu) yazıyorum. PHP'de kullandığımda iyi çalışıyor, JSON geçerli, her şey yolunda. Delphi'de kullandığımda hiçbir şey işe yaramıyor. Ben internet arama yaparkensystem.json

buldum:

desearilizing JSON using SuperObject

ama bu yöntem benim için boş dizeleri döndürür.

JSON öğelerini dizi olarak kullanmak istiyorum (ör. JSONValue.items [i]).

Delphi XE7 System.JSON kullanıyorum ve superobject veya başka bir kitaplık kullanmak istemiyorum.

Dizi olarak nasıl kullanılır?

Ben JSON üretir benim kodu yapıştırın:

var 
    qry: TfdQuery; 
    FieldsObj: TJSONObject; 
    FieldNameArray: TJSONArray; 
    I: Integer; 
    DataObj: TJSONObject; 
    DataRows: TJSONArray; 
    RowFields: TJSONArray; 
    tablename:string; 
begin 
    tablename:='produkt'; 
    qry := TfdQuery.Create(Self); 
    qry.SQL.Text := 'select * from produkt where (id ='''+ProductID+''')'; 
    qry.Connection := FDConnection1; 
    qry.Open; 
    FieldsObj := TJSONObject.Create; 
    FieldNameArray := TJSONArray.Create; 
    for I := 0 to qry.FieldCount - 1 do 
    FieldNameArray.Add(qry.Fields[I].FieldName); 
    FieldsObj.AddPair(TableName, FieldNameArray); 
    DataObj := TJSONObject.Create; 
    DataRows := TJSONArray.Create; 
    qry.First; 
    while not qry.Eof do 
    begin 
    RowFields := TJSONArray.Create; 
    for I := 0 to qry.FieldCount - 1 do 
     RowFields.Add(qry.Fields[I].AsString); 
    DataRows.Add(RowFields); 
    qry.Next; 
    end; 
    DataObj.AddPair('data', DataRows); 
    Result := TJSONArray.Create(FieldsObj, DataObj); 
    qry.Free; 

Ve bu sonucudur:

{ 
    "ProductID": "1", 
    "result": [{ 
     "produkt": ["id", "parent_id", "full_name", "opcja_1", "opcja_2", "opcja_3", "opcja_4", "opcja_5", "opcja_6", "opcja_7", "opcja_8", "opcja_9", "opcja_10", "opcja_11", "opcja_12", "field_address1", "field_address2", "quantity", "opis", "zdjecie1", "zdjecie2", "zdjecie3", "samples", "link_stable0", "link_stable1", "link_stable2", "price1", "price2", "price3"] 
    }, { 
     "data": [ 
      ["1", "1", "name", "1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "12", "10", "20", "1,2", "description of product", "http://www.vphosted.com/e6=0", "photo link2", "photo link 3", "sample project file link", "link option", "10", "link", "10", "link", "10"] 
     ] 
    }] 
} 
+3

Burada ne sorduğunuz belli değil. Bu kodun üretmekte olduğu JSON'u tüketmekte sorun yaşadığınızı ve PHP tarafından doğru bir şekilde tüketilen JSON üretildiğini ve üreticinin koduyla ilgili yanlış bir şey olmadığını öne sürüyorsunuz. * Tüketici * kodunuzu gerçekten göndermelisiniz ve nasıl ve neden sizin için çalışmadığını daha açık bir şekilde açıklamalısınız. – Deltics

+1

Json'un seçilen yapısı çok garip. –

+0

Sir Rufo'ya katılıyorum - seçilen yapı çok tuhaf ve en düşük seviyede JSON çiftlerinin olmaması sorunlara neden olacaktır. – Dsm

cevap

1

Bu daha formatında ben bekleyebileceğiniz JSON üretecektir:

var 
    qry: TfdQuery; 
    FieldsObj: TJSONObject; 
    //FieldNameArray: TJSONArray; 
    I: Integer; 
    DataObj: TJSONObject; 
    FieldObj: TJSONObject; 
    DataRows: TJSONArray; 
    RowFields: TJSONArray; 
    tablename:string; 
begin 
    tablename:='produkt'; 
    qry := TfdQuery.Create(Self); 
    qry.SQL.Text := 'select * from produkt where (id ='''+ProductID+''')'; 
    qry.Connection := FDConnection1; 
    qry.Open; 
    FieldsObj := TJSONObject.Create; 
    //FieldNameArray := TJSONArray.Create; 
    //for I := 0 to qry.FieldCount - 1 do 
    // FieldNameArray.Add(qry.Fields[I].FieldName); 
    //FieldsObj.AddPair(TableName, FieldNameArray); 
    DataObj := TJSONObject.Create; 
    DataRows := TJSONArray.Create; 
    qry.First; 
    while not qry.Eof do 
    begin 
    RowFields := TJSONArray.Create; 
    for I := 0 to qry.FieldCount - 1 do 
    begin 
     FieldObj := TJSONObject.Create; 
     FieldObject.AddPair(qry.Fields[I].FieldName, qry.Fields[I].AsString)); 
     RowFields.Add(FieldObj); 
    end; 
    DataRows.Add(RowFields); 
    qry.Next; 
    end; 
    DataObj.AddPair('data', DataRows); 
    Result := TJSONArray.Create(FieldsObj, DataObj); 
    qry.Free; 

Kayıt yapısını biliyorsanız, REST.JSON kullanmayı tercih ederim. eminim XE7 ile birlikte geliyor ve kullanımı çok daha kolay. Sadece, bu yapının bir örneğini oluşturmak, nesne yapısını oluşturmak için alan değerleri ile doldurmak ve dize oluşturmak için

TJSON.ObjectToJsonString(fObject) 

kullanabilir ve

iObject := TJSON.JsonToObject<TMyObject>(pTransferString); 

Nesnenizi geri kazanmak için.

Bu yöntemi kullanarak daha eksiksiz bir örnek istiyorsanız, bildirin ve göndereceğim.

+0

içinde bulabilmemiz için tüketici kodunu yayınlamanız gerekmektedir. .ve sonra biçimini değiştirmek onun PHP tüketicisini kırdı ... Eh, o, dizilerden ziyade iki dizi yapmak için seçti ve bu abartılı iken, hala doğru. Onun kodu doğru tüketici kodu ve lib verilen ile çalışılabilir. Ben DBX-JSON (System.JSON değil, yeniden adlandırıldı şüpheliydi) hatırlıyorum çok fazla hata vardı. –