Невозможно проанализировать объект json в nodejs

Я пытаюсь перебрать каждый элемент json, но не могу распечатать. Я тоже устал от JSON.parse ().

код:

var j = "{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:16.881\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":527,\"Message\":\"SyncData: Billing Software SyncData() called\"}\r\n{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:17.060\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":38,\"Message\":\"SyncData: Start\"}\r\n{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:17.111\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":44,\"Message\":\"SyncData: LocalConnectionString = Data Source=PARAM\\\\MSSQL2K8r2;Initial Catalog=HQPharma;User ID=sa;Password=developer;\"}";  
for(var key in j){
    console.info(j[key]);
}

приведенный выше код печатает каждый символ, например Невозможно проанализировать объект json в nodejs

Это классическая путаница между форматом данных JSON и объектами JavaScript. У вас есть нить, и вы никогда не анализируете его как JSON, поэтому вы просто зацикливаете его символы.

Álvaro González 12.10.2018 11:03

То, что сказал @ ÁlvaroGonzález, правда, плюс после того, как вы использовали JSON.parse(), вы, скорее всего, захотите зацикливаться на Object.keys(j), а не на j напрямую.

ChatterOne 12.10.2018 11:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
77
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы должны проанализировать строку и преобразовать ее в объект JSON с помощью метода JSON.parse ().

РЕДАКТИРОВАТЬ

Я заметил, что в вашей строке есть несколько объектов JSON, поэтому перед переходом к методу \r\n вам следует разделить строку на JSON.parse.

var j = "{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:16.881\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":527,\"Message\":\"SyncData: Billing Software SyncData() called\"}\r\n{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:17.060\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":38,\"Message\":\"SyncData: Start\"}\r\n{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:17.111\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":44,\"Message\":\"SyncData: LocalConnectionString = Data Source=PARAM\\\\MSSQL2K8r2;Initial Catalog=HQPharma;User ID=sa;Password=developer;\"}";
var list = j.split('\r\n');
for (var i = 0; i < list.length; ++i) {
  var obj = JSON.parse(list[i]);
  for(var key in obj) {
    console.info(obj[key]);
  }
}

SyntaxError: JSON.parse: неожиданный непробельный символ после данных JSON в строке 2, столбец 1 данных JSON в строке 10

Juned Ansari 12.10.2018 11:10

Как сказал Матиас в своем ответе, предоставленный вами JSON недействителен. Я этого не проверял. Это причина ошибки.

oniramarf 12.10.2018 11:14

Это недействительно, и это не объект, а массив объектов! : D

Matías Fidemraizer 12.10.2018 11:16

Ага, забыл сменить лог j[key] на obj[key]. Теперь это работает.

oniramarf 12.10.2018 12:15

Очевидно, вы повторяете символы данной строки. Эта строка имеет формат JSON, но по-прежнему представляет собой массив символов.

Кроме того, ваш JSON недействителен. После очистки я заметил, что это JSON-массив объектов JSON:

const os = JSON.parse(`[{
		"Type": "INFO ",
		"TimeStamp": "2018-10-10 12:05:16.881",
		"IP": "2001:0:9d38:90d7:804:3589:8a3c:e43a",
		"MacId": "84:7B:EB:3F:65:A4",
		"OS": "Microsoft Windows 10 Home Single Language",
		"Method": "SyncData",
		"LineNo": 527,
		"Message": "SyncData: Billing Software SyncData() called"
	},
	{
		"Type": "INFO ",
		"TimeStamp": "2018-10-10 12:05:17.060",
		"IP": "2001:0:9d38:90d7:804:3589:8a3c:e43a",
		"MacId": "84:7B:EB:3F:65:A4",
		"OS": "Microsoft Windows 10 Home Single Language",
		"Method": "SyncData",
		"LineNo": 38,
		"Message": "SyncData: Start"
	},
	{
		"Type": "INFO ",
		"TimeStamp": "2018-10-10 12:05:17.111",
		"IP": "2001:0:9d38:90d7:804:3589:8a3c:e43a",
		"MacId": "84:7B:EB:3F:65:A4",
		"OS": "Microsoft Windows 10 Home Single Language",
		"Method": "SyncData",
		"LineNo": 44,
		"Message": "SyncData: LocalConnectionString = Data Source=PARAM\\\\MSSQL2K8r2;Initial Catalog=HQPharma;User ID=sa;Password=developer;"
	}
]`)


for (let o of os)
  for (let key in o)
    console.info(key, ' = ', o[key])

@JunedAnsari Нет, чтобы автоматически исправить это: D Я исправил это вручную, другого способа сделать это нет.

Matías Fidemraizer 12.10.2018 11:27

@JunedAnsari Уточнение: как указывает другой ответ, когда я сказал нет автофиксации, я имел в виду, что вам нужно реализовать исправление самостоятельно. В моем случае, чтобы ответить вам, я исправил вручную. В любом случае, я считаю, что исправление JSON выходит за рамки вашего вопроса.

Matías Fidemraizer 12.10.2018 11:29
Ответ принят как подходящий

Когда я отформатировал вашу строку, я заметил следующее:

{
 "Type": "INFO ",
  "TimeStamp": "2018-10-10 12:05:16.881",
  "IP": "2001:0:9d38:90d7:804:3589:8a3c:e43a",
  "MacId": "84:7B:EB:3F:65:A4",
  "OS": "Microsoft Windows 10 Home Single Language",
  "Method": "SyncData",
  "LineNo": 527,
  "Message": "SyncData: Billing Software SyncData() called"
}\n{
  "Type": "INFO ",
  "TimeStamp": "2018-10-10 12:05:17.060",
  "IP": "2001:0:9d38:90d7:804:3589:8a3c:e43a",
  "MacId": "84:7B:EB:3F:65:A4",
  "OS": "Microsoft Windows 10 Home Single Language",
  "Method": "SyncData",
  "LineNo": 38,
  "Message": "SyncData: Start"
}\n{
  "Type": "INFO ",
  "TimeStamp": "2018-10-10 12:05:17.111",
  "IP": "2001:0:9d38:90d7:804:3589:8a3c:e43a",
  "MacId": "84:7B:EB:3F:65:A4",
  "OS": "Microsoft Windows 10 Home Single Language",
  "Method": "SyncData",
  "LineNo": 44,
  "Message": "SyncData: LocalConnectionString = Data Source=PARAM\\MSSQL2K8r2;Initial Catalog=HQPharma;User ID=sa;Password=developer;"
}

Чтобы работать с этим, вы можете сделать что-то вроде этого

const j = "{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:16.881\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":527,\"Message\":\"SyncData: Billing Software SyncData() called\"}\r\n{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:17.060\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":38,\"Message\":\"SyncData: Start\"}\r\n{\"Type\": \"INFO \",\"TimeStamp\":\"2018-10-10 12:05:17.111\",\"IP\":\"2001:0:9d38:90d7:804:3589:8a3c:e43a\",\"MacId\":\"84:7B:EB:3F:65:A4\",\"OS\":\"Microsoft Windows 10 Home Single Language\",\"Method\":\"SyncData\",\"LineNo\":44,\"Message\":\"SyncData: LocalConnectionString = Data Source=PARAM\\\\MSSQL2K8r2;Initial Catalog=HQPharma;User ID=sa;Password=developer;\"}";  

//first remove the \n and join with a comma ,
// enclose your multiple object within an array
const joinedWithComma = "[" + j.split('\n').join(',') + "]"


//now parse this
const parsedValue = JSON.parse(joinedWithComma)


console.info(parsedValue)

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

Matías Fidemraizer 12.10.2018 11:55

@ MatíasFidemraizer хорошо, я понял, что как только строка будет проанализирована, OP сможет перебирать ее?

Prasanna 12.10.2018 11:56

@ MatíasFidemraizer, и я также считаю, что вопрос гласит, что OP должен проанализировать строку: - «невозможно проанализировать объект json»

Prasanna 12.10.2018 11:59

Я так не думаю. Я действительно считаю, что OP хотел найти решение, чтобы избежать собственных усилий ... Проблема, описанная во всем вопросе, связана с путаницей строки с объектом, а также - но только мелочью - JSON был недействительным. В любом случае, я не ожидаю, что кто-то попросит превратить нас в человеческий JSON-линтер: D

Matías Fidemraizer 12.10.2018 11:59

@ MatíasFidemraizer представленная строка выглядит как строка ответа; из вызова API или из других источников. Заголовок вопроса, а также упоминание об отказе JSON.parse(), я мог только сделать вывод, что OP может запрашивать способ анализа этого «типа» строк.

Prasanna 12.10.2018 12:05

Что произойдет, если у вас есть такая недвижимость, как "Message": "SyncData: LocalConnectionString = Data Source=PARAM\\MSSQL2K8r2;Initial Catalog=HQPharma;User ID=sa;Password=developer;\nThis is just a string message"?

ChatterOne 12.10.2018 13:05

@ChatterOne не сработает. Представленное решение работает только для представленной проблемы.

Prasanna 13.10.2018 10:16

Другие вопросы по теме