2017-03-23 11 views
1

このjsonからすべてのユーザーを取得したいと思います。X-SuperObjectを使用してJSONのネストされた値にアクセスする方法

{ 
    "status": "ok", 
    "next_max_id": "AQAmA1l9NAQXa", 
    "sections": [ 
    { 
     "module": null, 
     "show_view_all": null, 
     "title": null, 
     "users": [ 
     { 
      "pk": 48165888, 
      "is_verified": false, 
      "profile_pic_url": "http://scontent-sit4-1.cdninstagram.com/t51.2885-19/s150x150/17332306_1915592632007479a.jpg", 
      "full_name": "Jason Giovany Castro Morales", 
      "is_private": false, 
      "has_anonymous_profile_picture": false, 
      "username": "jasongiovanycastromorales", 
      "profile_pic_id": "14699765111792881_48165888" 
     } 
     ] 
    } 
    ] 
} 

ここで、すべてのユーザー名を取得しようとしました。

procedure TForm2.Button6Click(Sender: TObject); 
var 
    json : ISuperObject; 
    node : ISuperObject; 
    item : IMember; 
begin 
    try 
    json := TSuperObject.Create(list.Text); 

    for item in json['sections.users'].AsArray do 
    begin 
     node := item.AsObject; 
     Memo4.Lines.Add(node.S['username']); 
    end; 
    finally 
    end; 
end; 

2回目の試み.. AV!

var 
    json   : ISuperObject; 
    node   : ISuperObject; 
    item, item2   : IMember; 
    begin 
    json := SO(list.Text); 

    for item in json['sections'].AsArray do 
    begin 
     for item2 in json['users'].AsArray do 
     begin 
     node := item.AsObject; 

     Memo1.Lines.Add(node.S['username']); 
     end; 
    end; 
    end; 

200名の値は、このJSON である私は何も、時々、AV私はJSONコードwiththeの周りに再生しようとすると、私の質問は値usernameを取得するには、正しくこのJSONを解析する方法、であるを取得していませんか?ありがとうございました。

答えて

1

まず、自分のウェブサイトにアクセスして、SOの操作方法を理解するためのサンプルとデモを見つけることをおすすめします。

sectionsの配列に含まれるすべてのオブジェクトに配列usersが含まれていると、あなたの例が壊れて、わからないような入力データの形式が指定されていません。とにかく、あなたのスニペットでこの例が有効であるはずです。

SuperObject

procedure TForm2.Button6Click(Sender: TObject); 
var 
    json, user, section : ISuperObject; 
begin 
    json := SO(list.Text); 
    for section in json['sections'] do 
    begin 
    if Assigned(section['users']) then 
    begin 
     for user in section['users'] do 
     begin 
     if user.S['username'] <> '' then 
      Memo4.Lines.Add(user.S['username']); 
     end; 
    end; 
    end; 
end; 

EDIT: 実際には、あなたが別の何かである、SuperObjectが、X-SuperObjectを使用していません。私はそのライブラリを一度も使用していませんが、自分のウェブサイトの例だけで問題を見つけることができました.item2の代わりにitemまたはjsonitemの代わりに2番目のループを使用しています。

X-SuperObject

procedure TForm2.Button6Click(Sender: TObject); 
var 
    json : ISuperObject; 
    item, item2 : IMember; 
begin 
    json := TSuperObject.Create(list.Text); 
    for item in json['sections'].AsArray do 
    begin 
    for item2 in item.AsObject['users'].AsArray do 
     Memo1.Lines.Add(item2.AsObject['username'].ToString); 
    end; 
end; 
+0

エラー 'ISuperExpression'に 'GetEnumerator'のメンバーが含まれていないか、アクセスできないため、コレクションタイプ 'ISuperExpression'で 'or-inステートメントを操作できません。' –

+0

自分の回答を編集しました。実際に使用する変数に注意を払い、質問を明確に指定する必要があります。 – Triber

+0

私は悪いです、私はX-SuperObjectがSuperObjectへの単なるアップグレードだと思っています。多くのありがとうございました –

0

免責事項:この答えはSuperObjectに関するものです。当時、この答えが与えられました。質問が実際にはXSuperObjectを参照していることは不明でした。


私はあなたが、少なくとも、アクセス違反を取得する必要がありますので、これはそうである何

を取得します。これは、スーパーオブジェクトを正しい方法で作成していないためです。

コンストラクタTSuperObject.Createを呼び出す代わりに、SO()ファクトリ関数を使用することをお勧めします。

次に、sectionsusersの両方が配列であることを覚えておく必要があります。このように、ネストされた反復で両方の配列を反復処理する必要があります。

var 
    json: ISuperObject; 
    section: ISuperObject; 
    user: ISuperObject; 
begin 
    json := SO(list.Text); 
    for section in json['sections'] do // iterate sections 
    for user in section['users'] do // iterate users 
     Memo4.Lines.Add(user.S['username']); 
end; 

注:をこの例では、最小限のアプローチです。例外を防ぐには、さらに確認(例:Assigned())を追加する必要があります。

+0

'ISuperExpression'に 'GetEnumerator'のメンバーが含まれていないか、for-inステートメントがコレクションタイプ 'ISuperExpression'私は 'IMember'を使ったのですか? –

+0

これまでにコンパイルとテストをしなくても、私の答えは掲載されませんでした。そのようなエラーはありません。 'ISuperExpression'はどこから来たのですか?私のコードは、 'ISuperObject'を返す' ISuperObject'の列挙子を排他的に反復しています。 –

+0

json ['sections']のセクションの 'for this section'の//このセクションの 'do // iteration section' –

関連する問題