
05.12.2021, 15:38
|
Новичок на форуме
|
|
Регистрация: 05.12.2021
Сообщений: 6
|
|
обращение к JSON
Доброго времени суток. не пойму в чем причина не могу обратиться к элементам json.
Имею на странице index.html
<textera id='text'>
{
"TaggedPDF": {
"Part": [
{
"H3": "Раздел",
"Sect": {
"Sect": [
{
"H4": "Таблица",
"P": [
"Состав",
"тип"
],
"Table": [
{
"TR": [
{
"TH": [
"Номер",
"Наименование",
"Ед. изм.",
"101",
"102",
"103",
"104"
]
},
{
"TH": [
"100",
"Затраты",
"ч"
],
"TD": [
"154",
"185",
"227",
"0,319"
]
},
{
"TH": [
"0101",
"разряд",
"-"
],
"TD": [
"3,8",
"3,8",
"3,8",
"3,8"
]
},
{
"TH": [
"0100",
"Затраты",
"ч"
],
"TD": [
"0,8",
"0,965",
"0,175",
"0,66"
]
},
{
"TH": [
"",
"МЕХАНИЗМЫ",
""
],
"TD": [
"",
"",
"",
""
]
},
{
"TH": "0302",
"TD": [
"Топор",
"ч",
"16",
"193",
"235",
"332"
]
},
{
"TH": "0204",
"TD": [
"Молоток",
"ч",
"16",
"193",
"235",
"332"
]
}
]
}
]
},
{
"H4": "Таблица",
"P": "Состав",
"Table": {
"TR": [
{
"TH": [
"Номер",
"Наименование",
"Ед. изм.",
"701"
]
},
{
"TD": [
"0100",
"Затраты",
"ч",
"71"
]
},
{
"TD": [
"",
"МЕХАНИЗМЫ",
"",
""
]
},
{
"TD": [
"0102",
"Молоток",
"ч",
"71"
]
}
]
}
}
]
}
}
]
}
}
</textera>
через валидотор проверил json все в норме
обрабатываю данные так через script.js
window.onload = parse; // при загрузке
function line(a){
console.log ('key=Table содержимое ', a); // рабочий вариант в 2х таблицах
console.log('key=Table содержимое ', a.TR[0].TH[0]); // для второй таблицы должно работать но нет ошибка Uncaught TypeError: Cannot read properties of undefined (reading '0')
}
function traverse(jsonObj){
if (jsonObj !== null && typeof jsonObj == "object" ) { // проверка на объект
Object.entries(jsonObj).forEach(([key, value]) => { // перебираем таблицы ключ значение
if (key=="Table") { //если ключ равняется Table
line(value); // обрабатываем дальше
}
traverse(value); // перебор вложения
});
}
}
function parse() {
let obj = JSON.parse(document.getElementById('text').value);
traverse(obj.TaggedPDF.Part[0].Sect.Sect); // выбираю нужную часть json
}
обращение ко всем элементам в line(a) для первой таблицы проходит успешно, в ручную могу обращаться ко всем элементам
а вот ко второй таблице не получается обращаться к элементам a.TR[0] и далее (.TH[0]) максимум отображает до a.TR после ошибка Uncaught TypeError: Cannot read properties of undefined (reading '0')
Последний раз редактировалось u015173353@mail.ru, 05.12.2021 в 19:33.
|
|

05.12.2021, 15:42
|
 |
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,138
|
|
u015173353@mail.ru,
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]
О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
|
|

05.12.2021, 16:34
|
 |
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,138
|
|
u015173353@mail.ru,
строка 110 сравните со строкой 15
|
|

05.12.2021, 18:39
|
Новичок на форуме
|
|
Регистрация: 05.12.2021
Сообщений: 6
|
|
я знаю разницу обращения к ним
обращение к строке 015 a[0].TR[0].TH[0] результат "Номер"
обращение к строке 110 a.TR[0].TH[0] должен быть результат "Номер" но в консоле выдает ошибку
|
|

05.12.2021, 19:31
|
 |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,245
|
|
Бивас, тест (с)
const o = {
"TaggedPDF": {
"Part": [
{
"H3": "Раздел",
"Sect": {
"Sect": [
{
"H4": "Таблица",
"P": [
"Состав",
"тип"
],
"Table": [
{
"TR": [
{
"TH": [
"Номер",
"Наименование",
"Ед. изм.",
"101",
"102",
"103",
"104"
]
},
{
"TH": [
"100",
"Затраты",
"ч"
],
"TD": [
"154",
"185",
"227",
"0,319"
]
},
{
"TH": [
"0101",
"разряд",
"-"
],
"TD": [
"3,8",
"3,8",
"3,8",
"3,8"
]
},
{
"TH": [
"0100",
"Затраты",
"ч"
],
"TD": [
"0,8",
"0,965",
"0,175",
"0,66"
]
},
{
"TH": [
"",
"МЕХАНИЗМЫ",
""
],
"TD": [
"",
"",
"",
""
]
},
{
"TH": "0302",
"TD": [
"Топор",
"ч",
"16",
"193",
"235",
"332"
]
},
{
"TH": "0204",
"TD": [
"Молоток",
"ч",
"16",
"193",
"235",
"332"
]
}
]
}
]
},
{
"H4": "Таблица",
"P": "Состав",
"Table": {
"TR": [
{
"TH": [
"Номер",
"Наименование",
"Ед. изм.",
"701"
]
},
{
"TD": [
"0100",
"Затраты",
"ч",
"71"
]
},
{
"TD": [
"",
"МЕХАНИЗМЫ",
"",
""
]
},
{
"TD": [
"0102",
"Молоток",
"ч",
"71"
]
}
]
}
}
]
}
}
]
}
}
alert(o.TaggedPDF.Part[0].Sect.Sect[0].Table[0].TR[0].TH[0])
alert(o.TaggedPDF.Part[0].Sect.Sect[1].Table.TR[0].TH[0])
|
|

05.12.2021, 19:35
|
 |
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,138
|
|
u015173353@mail.ru,
массив пропущен в строке 110. сделайте структуру однородной и всё заработает.
|
|

05.12.2021, 19:40
|
 |
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,138
|
|
u015173353@mail.ru,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
</head>
<body>
<textarea id='text'>
{
"TaggedPDF": {
"Part": [
{
"H3": "Раздел",
"Sect": {
"Sect": [
{
"H4": "Таблица",
"P": [
"Состав",
"тип"
],
"Table": [
{
"TR": [
{
"TH": [
"Номер",
"Наименование",
"Ед. изм.",
"101",
"102",
"103",
"104"
]
},
{
"TH": [
"100",
"Затраты",
"ч"
],
"TD": [
"154",
"185",
"227",
"0,319"
]
},
{
"TH": [
"0101",
"разряд",
"-"
],
"TD": [
"3,8",
"3,8",
"3,8",
"3,8"
]
},
{
"TH": [
"0100",
"Затраты",
"ч"
],
"TD": [
"0,8",
"0,965",
"0,175",
"0,66"
]
},
{
"TH": [
"",
"МЕХАНИЗМЫ",
""
],
"TD": [
"",
"",
"",
""
]
},
{
"TH": "0302",
"TD": [
"Топор",
"ч",
"16",
"193",
"235",
"332"
]
},
{
"TH": "0204",
"TD": [
"Молоток",
"ч",
"16",
"193",
"235",
"332"
]
}
]
}
]
},
{
"H4": "Таблица",
"P": "Состав",
"Table": [{
"TR": [
{
"TH": [
"Номер",
"Наименование",
"Ед. изм.",
"701"
]
},
{
"TD": [
"0100",
"Затраты",
"ч",
"71"
]
},
{
"TD": [
"",
"МЕХАНИЗМЫ",
"",
""
]
},
{
"TD": [
"0102",
"Молоток",
"ч",
"71"
]
}
]
}]
}
]
}
}
]
}
}
</textarea>
<script>
window.onload = parse; // при загрузке
function line(a){
// console.log ('key=Table содержимое ', a); // рабочий вариант в 2х таблицах
console.log('key=Table TR ', a[0].TR); // для второй таблицы должно работать но нет
}
function traverse(jsonObj){
if (jsonObj !== null && typeof jsonObj == "object" ) { // проверка на объект
Object.entries(jsonObj).forEach(([key, value]) => {
// перебираем таблицы ключ значение
if (key=="Table") { //если ключ равняется Table
line(value); // обрабатываем дальше
}
traverse(value); // перебор вложения
});
}
}
function parse() {
let obj = JSON.parse(document.getElementById('text').value);
traverse(obj.TaggedPDF.Part[0].Sect.Sect); // выбираю нужную часть json
}
</script>
</body>
</html>
|
|

05.12.2021, 19:42
|
Новичок на форуме
|
|
Регистрация: 05.12.2021
Сообщений: 6
|
|
тоже по началу так проверял срабатывало. но json состоит из 1000 таблиц долго буду искать такие таблицы. прописать в самом js да работает не редактируя можно сделать на проверку существования, но вот с формы index.html из textarea не пашет. путь не существует как бы
Структуру вручную подправил работает)), но как без этих исправлений обращаться к элементам?
a[0].TR[0].TH[0] в первой таблице я могу так все элементы перебрать
a.TR[0].TH[0] аналогично так же должно работать для второй но выходит ошибка не могу найти 0
Последний раз редактировалось u015173353@mail.ru, 05.12.2021 в 20:00.
|
|

05.12.2021, 20:11
|
 |
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,138
|
|
Сообщение от u015173353@mail.ru
|
так же должно
|
так уберите строку console.log('key=Table содержимое ', a.TR[0].TH[0]); или сделайте её рабочей типа if(a.TR) ... else
|
|

05.12.2021, 20:16
|
Новичок на форуме
|
|
Регистрация: 05.12.2021
Сообщений: 6
|
|
рони,
делал так if(a.TR) тут я определяю что это вторая таблица но когда дальше пытаюсь вытащить данные (например содержимое TH в) a.TR[0] уже выходит ошибка (когда дописываю [0]) "Uncaught TypeError: Cannot read properties of undefined (reading '0')." js уже не находит вложения
с index.html копирую данные json
именно тогда выходит ошибка, когда в js прописываю в переменную почему то работает хотя не вижу разницы откуда брать данные.
Последний раз редактировалось u015173353@mail.ru, 05.12.2021 в 20:19.
|
|
|
|