2016-04-14 3 views
0

Я пишу код (сервер отдыха), который производит для меня данные в формате JSON. Когда я использую его в PHP, он отлично работает, JSON действительно, все в порядке. Когда я использую его в Delphi, ничего не работает.Невозможно десериализовать действительный JSON, используя system.json

Когда я ищу Интернет я нашел:

desearilizing JSON using SuperObject

, но этот метод возвращает пустые строки для меня.

Я хочу использовать элементы JSON в качестве массива (например, JSONValue.items [i]).

Я использую Delphi XE7 System.JSON и не хочу использовать суперобъект или любые другие библиотеки.

Как использовать его как массив?

я вставляю свой код, который генерирует JSON:

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; 

И это результат:

{ 
    "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

Непонятно, что вы здесь задаете. Вы, кажется, говорите, что у вас есть проблема, связанная с JSON, которую производит этот код, и что он производит JSON, который правильно потребляется PHP, что говорит о том, что в самом коде производителя нет ничего плохого. Вам действительно нужно опубликовать свой * потребительский код и более четко объяснить, как и почему он не работает для вас. – Deltics

+1

Выбранная структура json очень странная. –

+0

Я согласен с сэром Руфо - выбранная структура очень странная, и отсутствие пар JSON на самом низком уровне вызовет проблемы. – Dsm

ответ

1

Это будет производить JSON более в том формате, который я хотел бы ожидать:

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; 

Если вы знаете структуру записи, я бы предпочел использовать REST.JSON, который я Я уверен, что корабли с XE7 и гораздо проще в использовании. Вы просто создать структуру объекта, создать экземпляр этой структуры, заполнить его с вашими значениями поля и использовать

TJSON.ObjectToJsonString(fObject) 

создать строку и

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

, чтобы получить объект обратно.

Если вы хотите получить более полный пример, используя этот метод, сообщите мне, и я отправлю сообщение.

+0

.. . и затем изменение формата сломало бы его пользователя PHP ... Ну, он решил сделать два массива, а не массив кортежей, и хотя это экстравагантно, все равно правильно. Его код можно работать с учетом правильного кода пользователя и lib. Чем я помню DBX-JSON (который, как я подозревал, был переименован не в System.JSON), в нем было много ошибок. –

Смежные вопросы