#javascript #jquery #json #html
#javascript #jquery #json #HTML
Вопрос:
Я пытаюсь создать веб-сайт для настольной игры, созданной моим другом, и я хочу хранить все данные в файлах JSON и извлекать данные в HTML-файлах с помощью Javascript. Я хочу, например, сохранить каждый класс в отдельном файле, включив в файл его список навыков (в котором указаны только имя навыка и уровень, изученный в этом файле), а также основной список всех навыков, их стоимость и их описания в другом файле. В принципе, я хочу обрабатывать два или более файлов JSON как связанные таблицы в базе данных.
В этом примере это то, что будет найдено в файле класса:
{
"name": "Class 1",
"skills": [
{
"name": "Skill 1",
"level": 1
},
{
"name": "Skill 2",
"level": 2
},
{
"name": "Skill 3",
"level": 3
}
]
}
И это основной файл навыков:
{
"skills": [
{
"name": "Skill 1",
"desc": "This is the first skill.",
"cost": "1 MP"
},
{
"name": "Skill 2",
"desc": "This is the second skill.",
"cost": "2 HP"
},
{
"name": "Skill 3",
"desc": "This is the third skill.",
"cost": "3 Gold"
},
{
"name": "Skill 4",
"desc": "This is a skill from a different class.",
"cost": "All MP"
}
]
}
И я хочу, чтобы HTML-файл выводил что-то вроде этого, используя эти два отдельных файла JSON:
<h1>Class 1</h1>
<table>
<tr>
<td>Skill 1</td>
<td>Level 1</td>
<td>1 MP</td>
<td>This is the first skill.</td>
</tr>
<tr>
<td>Skill 2</td>
<td>Level 2</td>
<td>2 HP</td>
<td>This is the second skill.</td>
</tr>
<tr>
<td>Skill 3</td>
<td>Level 3</td>
<td>3 Gold</td>
<td>This is the third skill.</td>
</tr>
</table>
Можно ли это сделать? И если да, то как?
Комментарии:
1. что вы пробовали? вы просите кого-то сделать это за вас?
2. Во-первых, спасибо человеку, который отредактировал сообщение для меня за форматирование. Во-вторых, я даже не знаю, с чего начать использовать данные из одного файла JSON для ссылки на данные из другого файла JSON.
3. ИТАК, в принципе, если файл класса имеет только 3 уровня , вы хотите отобразить в HTML эти три -> объединенные с основным файлом? Какую лучшую попытку в jQuery вы сделали до сих пор?
4. «Уровни» — это просто уровни класса, на которых персонаж этого класса изучает этот навык. Но да, это то, что я хотел бы сделать. И, честно говоря, я еще не пробовал использовать jQuery… Я полный новичок в jQuery и в некоторой степени новичок в JSON. Мой единственный опыт работы с JSON — редактирование файлов из игры Starbound.
Ответ №1:
// GET MASTER FILE
$.getJSON( "db/master.json", function( data ) {
var masterSkills = data.skills; // Store master Object
// Now that we've read the master data let's see how many
// (cause you're working with Arrays)
// of those skills has the Class 1 file
// GET Class 1 FILE
$.getJSON( "db/class.json", function( data ) {
// Collect Class 1 skills (3 of them) adding data from
// our stored masterSkills
var rows = []; // Array to create rows
$.each( data.skills, function( i, val ) { // 3 of them
rows.push( "<tr>"
"<td>" val.name "</td>"
"<td>Level " val.level "</td>"
"<td>" masterSkills[i].cost "</td>"
"<td>" masterSkills[i].desc "</td>"
"</tr>" );
});
// Append collected data do some element ("body")
$('<h1/>',{html: data.name }).appendTo("body");
$( "<table/>", { html: rows.join("") }).appendTo("body");
});
});
Приведенное выше можно использовать, ТОЛЬКО если последовательность обоих файлов соответствует количеству массивов, в
противном случае, если вы хотите быть уверены, что получите только правильные данные, соответствующие точному уровню (в случае, если ваш файл класса хранит данные неинкрементным способом), вам придется немного изменить JSONструктура, чтобы предотвратить ненужные циклы для поиска точного соответствия «уровню». Одним из способов было бы (главный файл):
{
"skill1" : {
"foo":"bar"
},
"skill2" : {
"blu":"bla"
},
}
теперь вместо поиска по всем свойствам «name» вы можете напрямую настроить целевой уровень и извлечь значения.
Комментарии:
1. Спасибо за ответ… Мне придется попробовать это позже. Честно говоря, от одного взгляда на код у меня голова идет кругом. На самом деле, поцарапайте это, часть «Сбор навыков класса 1, добавляющая данные из наших сохраненных masterSkills», ставит меня в тупик.
2. @NateMcCloud
$.each( data.skills
будет перебирать все навыки class.json, передавая (val
) значение в функцию обратного вызова. затем вы просто объединяете массивrows
с ключами, содержащими строковые представления необходимой структуры HTML TR. как только вы закончите с циклом, вы создаете таблицу$( "<table/>", { html:
и преобразуете свой массив, разделенный запятыми, обратно в строку, с помощью которой вы объединяете свой массивrows.join("")
и, наконец, добавляете таблицуbody
. Да, звучит пугающе… вам нужно немного изучить документы jQuery и ознакомиться с основами обработки массивов JS.3. Ага, теперь я понимаю. Забыл data.skills в $.каждая часть будет проходить через навыки класса, а не основные навыки. Сначала я думал, что вы полностью опустили ту часть, где вы перебирали навыки класса. Кроме того, порядок списка основных навыков и порядок навыков класса определенно НЕ будут точно совпадать, тем более, что каждый класс будет извлекаться из одного и того же основного списка.
4. @NateMcCloud тогда вам действительно нужно учесть мой совет и изменить структуру JSON, иначе вы будете повторять цикл снова и снова несколько раз, чтобы найти соответствие значения свойства. (Только основной файл, как в моем примере. использовать
"Skill XY"
как свойство объекта -> для представления значений этого навыка) Ваш JS станет намного более читаемым, а ответ будет быстрее.5. Я использовал что-то похожее на структуру, используемую файлами Starbound JSON, но, думаю, я не могу быть слишком разборчивым. Спасибо!
Ответ №2:
Пожалуйста, поправьте меня, если я неправильно понял ваш вопрос, но вы захотите сделать что-то вроде этого:
- Сохраните ваш основной файл json на сервере, например
data.json
. - Либо храните все остальное в том же файле, например, так:
{"classes": [ classes go here ]}
, или каждый в отдельном файле, напримерclass1.json
,class2.json
, и т.д. -
Затем используйте js для извлечения данных из файлов на вашу html-страницу, например:
$.getJSON('data.json', function (data) { // do this for all your files
// process your data here
}); -
Затем в обратных вызовах используйте базовые манипуляции с DOM для создания вашей таблицы, например (упрощенный пример):
var html = $("<p>The skill's name: " data["skills"][0]["name"]);
$("#yourtable").append(html);
РЕДАКТИРОВАТЬ: если вы хотите сделать это для каждого навыка, это так просто, как
var skills = data["skills"];
$.each(skills, function (index) {
// do your DOM stuff here (skills[index] is your skill)
});
Это повторит каждый навык и сделает то же самое для каждого из них.
РЕДАКТИРОВАТЬ 2: вот полный код, который вы просили.
// assume class data is stored in files called [classname].json
var classname = "yourclass", masterfile = "master.json";
// fetch data from the master file
$.getJSON(masterfile, function (masterData) {
// fetch data from your class file
$.getJSON(classname ".json", function (classData) {
var skills = classData["skills"]
// iterate over each skill in the class
for(var i = 0; i < skills.length; i ) {
var skill = skills[i];
// iterate over each skill in the master file
for(var j = 0; j < masterData["skills"].length; j ) {
// check if the names of the skill in the class and the skill in the master file match
if(masterData["skills"][j][name] === skill["name"]) {
// the skill names match
var s = masterData["skills"][j];
// s is now your skill variable, where s["cost"] is the cost, et cetera
// now, do your DOM manipulation using the skill data
}
}
}
});
});
Комментарии:
1. Что-то в этом роде … но я бы хотел, чтобы он извлекал данные из двух разных файлов JSON на основе общего attribute…in в данном случае — название навыка. JS извлекает из каждого навыка класса название навыка и уровень, полученные из файла класса, а также описание и стоимость соответствующего навыка из файла мастер-навыка и форматирует его в HTML.
2. Я могу дать вам полный код, который вам нужен, но я бы хотел, чтобы вы сначала попробовали сами. Если вам трудно, я покажу вам, как это сделать.
3. Я знаю, как форматировать данные JSON в HTML… чего я не понимаю, так это как использовать данные, извлеченные из одного файла JSON, для поиска и извлечения дополнительных данных из другого файла JSON на основе общего атрибута. Опять же, как таблицы в базе данных, которые связаны общими заголовками.
4. Я это понимаю. Ну, теперь я делаю: P Как я уже сказал, попробуйте сами. Я могу рассказать вам, как прямо сейчас, если хотите, но сначала вы должны попробовать сами.
5. Я сдаюсь. Я пытался разобраться в этом в течение месяца, и я все еще не ближе к решению, чем был, когда начинал. Поиск ответа в Google не дал никаких полезных результатов.