2016-04-14 16 views
0

JSON形式のデータを生成するコード(残りのサーバー)を記述します。私はPHPでそれを使用するとうまくいきます、JSONは有効です、すべてが大丈夫です。私がDelphiで使うと何も動かない。私はインターネットを検索するとsystem.jsonを使用して有効な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を消費し、PHPによって正しく消費されるJSONを生成するという問題があり、プロデューサコード自体に問題がないことを示唆しているようです。あなたは本当にあなたの*消費者*コードを掲示し、それがどうやってあなたのために働いていないのかをより明確に説明する必要があります。 – Deltics

+1

jsonの選択された構造は非常に奇妙です。 –

+0

私はSir Rufoに同意します。選択された構造は非常に奇妙であり、最も低いレベルで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に同梱されており、使用するのがはるかに簡単です。あなたは自分のオブジェクト構造を作成し、その構造体のインスタンスを作成し、自分のフィールド値を移入して、オブジェクトのバックを得るためにあなたの文字列と

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

を作成するために

TJSON.ObjectToJsonString(fObject) 

を使用しています。

このメソッドを使用してより完全な例をご希望の場合はお知らせください。

+0

..そして、フォーマットを変更すると、彼のPHPコンシューマーが壊れるでしょう...まあ、タプルの配列ではなく2つの配列を作ることにしましたが、それは贅沢ですが、それでも正しいです。彼のコードは、正しい消費者コードとlibを指定して作業することができます。私はDBX-JSON(System.JSONではなく名前が変更されたと思われる)が多くのバグを抱えていたことを覚えています。 –

関連する問題