Новичок в json и javascript, помогите?

#javascript #json

#javascript #json

Вопрос:

У меня есть файл json, который содержит вопросы и ответы, подобные этому.

 {
    "Questions": [
        { "Q": "I enjoy playing video games" },
        { "Q": "I enjoy reading" },
        { "Q": "I enjoy watching tv" }
    ],

    "Answers": [
        {
            "a": "Strongly Agree",
            "b": "Agree",
            "c": "Neutral",
            "d": "Disagree",
            "e": "Strongly Disagree"
        }
    ]
}
  

Ответы всегда одни и те же на каждый вопрос. Я пытаюсь выполнить цикл в javascript для отображения каждого вопроса и ответов под ним, что-то вроде этого

 1.I enjoy video games
RadioButton:Strongly agree   RadioButton:Agree  etc...

2. I enjoy reading
RadioButton:Strongly agree   RadioButton:Agree  etc...
  

прямо сейчас у меня есть это, но на самом деле это не работает

 $.getJSON("questions.json",function(data)
{
    $.each(data, function(i,data)
    {
        var div = document.createElement("div");
        div.setAttribute("id", i);
        document.createElement("div").setAttribute("id", i);

        var div_data = "<div class='questions'><h2>"   data.Questions.Q  "</h2><br />" 

        "<input type='radio' name='q"   i   "' id='q"   i   1 "' value='" data.Answers.a "'/>"  
        "<label for='q"   i   1 "'>"   data.Answers.a   "</label>" 

        "<input type='radio' name='q"   i   "' id='q"   i   2 "' value='" data.Answers.b "'/>"  
        "<label for='q"   i   2 "'>"   data.Answers.b   "</label>"  

        "<input type='radio' name='q"   i   "' id='q"   i   3 "' value='" data.Answers.c "'/>"  
        "<label for='q"   i   3 "'>"   data.Answers.c   "</label>"  

        "<input type='radio' name='q"   i   "' id='q"   i   4 "' value='" data.Answers.d "'/>"  
        "<label for='q"   i   4 "'>"   data.Answers.d   "</label>"  

        "<input type='radio' name='q"   i   "' id='q"   i   5 "' value='" data.Answers.e "'/>"  
        "<label for='q"   i   5 "'>"   data.Answers.e   "</label>"

         "</div>" ;

        document.getElementById("box").appendChild(div);
        div.innerHTML = div_data;

    });
});
  

Комментарии:

1. Это звучит как идеальный вариант использования для шаблонов jQuery .

2. круто, я это проверю. Но пока есть другие предложения?

3. Используйте Firebug из Firefox или Chrome developer tools и поместите точку останова внутри вашего блока .each и посмотрите, каково значение i . Вы также могли бы посмотреть на значение данных, чтобы убедиться, что оно соответствует вашим ожиданиям. Я ожидаю, что вам нужно перебирать данные.Однако есть вопросы.

4. Почему Questions это не просто список? например: ["I enjoy playing video games", "I enjoy reading", "I enjoy watching tv"]

Ответ №1:

Вы должны выполнить цикл data.Questions . Смотрите код ниже. Я также оптимизировал ваш код, так что HTML добавляется сразу, а не отдельно для каждого элемента.

Еще одно замечание: вам следует изменить i 1, 1 2, 1 3, etc часть на что-то более подходящее. В настоящее время это просто добавлено, потому что оно находится внутри контекста строки. Даже если вы добавите круглые скобки, логика все равно будет ошибочной: Для i=1, i 2 = 3 . Для i=2, i 1 также равно 3.

Я заменил i 1 "' на i "_1' , чтобы дать вам представление о правильном подходе.

 $.getJSON("questions.json",function(data)
{
    var html = "";
    $.each(data.Questions, function(i, question)
    {

        html  = "<div id="   i   ">"  
        "<div class='questions'><h2>"   question.Q  "</h2><br />" 

        "<input type='radio' name='q"   i   "' id='q"   i   "_1' value='" data.Answers.a "'/>"  
        "<label for='q"   (i   "_1'>"   data.Answers.a   "</label>" 

        "<input type='radio' name='q"   i   "' id='q"   i   "_2' value='" data.Answers.b "'/>"  
        "<label for='q"   i   "_2'>"   data.Answers.b   "</label>"  

        "<input type='radio' name='q"   i   "' id='q"   i   "_3' value='" data.Answers.c "'/>"  
        "<label for='q"   i   "_3'>"   data.Answers.c   "</label>"  

        "<input type='radio' name='q"   i   "' id='q"   i   "_4' value='" data.Answers.d "'/>"  
        "<label for='q"   i   "_4'>"   data.Answers.d   "</label>"  

        "<input type='radio' name='q"   i   "' id='q"   i   "_5' value='" data.Answers.e "'/>"  
        "<label for='q"   i   "_5'>"   data.Answers.e   "</label>"

          "</div></div>" ;
    });
    $("#box").append(html);
});
  

Комментарии:

1. Мне нравится ваш код намного больше, но я получаю вопрос, который не определен в строковых вопросах. q

2. Попробуйте еще раз, со строчной q . Также взгляните на мои комментарии относительно вашей функциональной логики и отредактированного кода, который предложил лучший подход.

3. Ой, неважно, была ли моя ошибка, все выглядит хорошо, но мои ответы я получаю неопределенными с переключателем рядом

4. Вы скопировали весь мой код? Ошибка, которую вы получаете, указывает на то, что data.Questions не определено. Итак, ваш JSON может выглядеть не так, как ожидалось.

Ответ №2:

Вы неправильно обращаетесь к JSON. data.Questions.Q и data.Answers.a неверно.

Оба data.Questions и data.Answers являются массивами. Вам пришлось бы перебирать эти массивы и обращаться к ним следующим образом data.Questions[i].Q .

Или измените свой JSON в соответствии с тем, как вы хотите, чтобы код мог их повторять. Вы можете исправить одно или другое, но они должны совпадать. Мне кажется, вы хотите исправить код для вопросов и JSON для ответов, но это дизайнерское решение, которое вы можете принять.

Комментарии:

1. Я поиграю с обоими, хотя понимаю, что вы имеете в виду. Я не могу получить доступ к ответам из data.Questions