1

したがって、JS に正常に渡されたこの JSON 構造があります。

{
"StepOne": [
    {
        "id": "2",
        "type": "1",
        "description": "How are you feeling?",
        "options": [
            {
                "opt_id": "1",
                "opt_desc": "Good"
            },
            {
                "opt_id": "2",
                "opt_desc": "Perfect"
            },
            .... etc

これは PageFive まで続き、質問の数は各ステップで 1 から 4 まで変化し、選択肢は質問ごとに null から約 10 まで変化します。この情報を使用して Javascript で複数ステップのフォームを生成したいのですが、内部データにアクセスする方法がわかりません。「PageOne」、「PageTwo」などしか見つかりません。次のコードを使用してそれを実行しています。

$(document).ready(function()
    {       
        $('#show-results').click(function() 
        {
            $.post('json.php', function(data) 
            {
                var pushedData = jQuery.parseJSON(data);


                $.each(pushedData, function(i, serverData)
                {
                    alert(i);
                })
            })
        })
    });

今、私はこれらの関数を試して内部の値を取得しました:

var desc = pushedData.PageOne.description;

var desc = pushedData['PageOne']['Description'];

そして、各ループ内で次のようなものを試しました

var desc = PageOne.description;

var desc = PageOne['description'];

それはすべて未定義として出てきます。ページを反復するために行ったのと同じ方法で、各ページの各質問を反復する方法はありますか? そこからすすぎ、繰り返し、各質問のオプションを繰り返しますか? 各レベルにアクセスできれば、ここでの最終的な目標である投票を動的に生成する準備が整っているはずです。

このコードは何かに関係していると思います(投稿した直後にわかりました)。しかし、完全には機能していません。

$(document).ready(function()
    {       
        $('#show-results').click(function() 
        {
            $.post('JSAAN.php', function(data) 
            {
                var pushedData = jQuery.parseJSON(data);

                $.each(pushedData, function(i, stepData)
                {
                    $.each(stepData, function(j, questionData)
                    {
                      // Print question here
                           $.each(questionData, function(k, optionData)
                           {
                                // Print option here
                           })

                    })
                })
            })
        })
    });
4

2 に答える 2

2

それはする必要があります

jsonData.StepOne[0].description

追加の[]配列ラッパーがあるためです。

構造によっては、追加のを省略するだけ[]で、すべてのオブジェクト プロパティに直接アクセスできます。次のようになります。

{
"StepOne":
    {
        properties
    },
"StepTwo":
    {
        properties
    }
}

ただし、そのような構造を持っていても問題ありません。次のように記述する必要があります。StepOne[x].prop

"StepOne":[
    {
        properties
    },
    {
        other props
    }],
 "StepTwo":[{...

投稿したコードによると、ステップごとにいくつかの質問があるため(?)、これが必要な場合があります。

単純なループは次のようになります。

for (var key in o) {
  if (o.hasOwnProperty(key)) {
    console.log(key + " -> " + o[key]);
  }
}

ただし、ネストされたループはより複雑です。

function loop(obj) {
    $.each(obj, function(key, val) {
        if($.isPlainObject(val) || $.isArray(val)) {

            console.log(key + " is an Object");
            // object or array -> call recursively
            loop(val);

        } else {
           // plain value
           console.log(key + "->" + val);
        }
    });
}

この例を見てください。

于 2012-07-17T09:20:35.050 に答える
1

StepOne !== PageOne の問題は別として:

StepOne は、オブジェクトを保持する配列です。

おそらく StepOne には 1 つのステップしかないはずなので、それは私には意味がありません... ...しかし、それは私だけです。

だからあなたは行かなければならないでしょう:

jsonData.StepOne[0].description;
jsonData.StepOne[0].options[0].opt_desc;
jsonData.StepOne[0].options[1].opt_desc;

など...

于 2012-07-17T09:18:25.650 に答える