JSON-разбор JSON ошибка, но отлично работает в валидаторе - PullRequest
0 голосов
/ 18 декабря 2018

Когда я пытаюсь проанализировать этот JSON (Discord webhook):

{
  "content": "this `supports` __a__ **subset** *of* ~~markdown~~ ? ```js\nfunction foo(bar) {\n  console.log(bar);\n}\n\nfoo(1);```",
  "embed": {
    "title": "title ~~(did you know you can have markdown here too?)~~",
    "description": "this supports [named links](https://discordapp.com) on top of the previously shown subset of markdown. ```\nyes, even code blocks```",
    "url": "https://discordapp.com",
    "color": 16324973,
    "timestamp": "2018-12-18T09:22:12.841Z",
    "footer": {
      "icon_url": "https://cdn.discordapp.com/embed/avatars/0.png",
      "text": "footer text"
    },
    "thumbnail": {
      "url": "https://cdn.discordapp.com/embed/avatars/0.png"
    },
    "image": {
      "url": "https://cdn.discordapp.com/embed/avatars/0.png"
    },
    "author": {
      "name": "author name",
      "url": "https://discordapp.com",
      "icon_url": "https://cdn.discordapp.com/embed/avatars/0.png"
    },
    "fields": [
      {
        "name": "?",
        "value": "some of these properties have certain limits..."
      },
      {
        "name": "?",
        "value": "try exceeding some of them!"
      },
      {
        "name": "?",
        "value": "an informative error should show up, and this view will remain as-is until all issues are fixed"
      },
      {
        "name": "<:thonkang:219069250692841473>",
        "value": "these last two",
        "inline": true
      },
      {
        "name": "<:thonkang:219069250692841473>",
        "value": "are inline fields",
        "inline": true
      }
    ]
  }
}

Используя этот код:

var parsed = JSON.parse(req.body)

Я получаю эту ошибку:

SyntaxError: Unexpected token o in JSON at position 1

Но если я использую веб-сайт, такой как

https://jsonformatter.curiousconcept.com

Для проверки JSON, он говорит, что JSON действителен.Что здесь не так?

ОБНОВЛЕНИЕ

Я использую экспресс-сервер для симуляции несогласованного сервера, поэтому вместо этого он отправляет веб-хуки на экспресс-сервер, и я получаюJSON с использованием req.body.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Было бы что-то вроде без использования JSONStream:

http.request(options, function(res) {
  var buffers = []
  res
    .on('data', function(chunk) {
      buffers.push(chunk)
    })
    .on('end', function() {
      JSON.parse(Buffer.concat(buffers).toString())
    })
})

Для использования с JSONStream это было бы что-то вроде:

http.request(options, function(res) {
  var stream = JSONStream.parse('*')
  res.pipe(stream)
  stream.on('data', console.log.bind(console, 'an item'))
})

(ИЛИ)

Вот некоторые шаги для этой проблемы.

Вы можете использовать lodash для решения этой проблемы.

импортировать lodash и вызвать unescape ().

const _ = require('lodash');

let htmlDecoder = function(encodedStr){
    return _.unescape(encodedStr);
}

htmlDecoder(JSON);
0 голосов
/ 18 декабря 2018

Это происходит потому, что JSON - это глобальный объект (это тот же объект, где вы читаете метод parse!), Поэтому при вызове JSON.parse(JSON) javascript думает, что вы хотите его проанализировать.

То же самое не происходит, когда вы передаете переменную в валидатор, потому что она будет присвоена локальной переменной:

let JSON = "{}";

validate(JSON);

function(x) {
JSON.parse(x); // here JSON is again your global object!
}

EDIT

Согласно вашему обновленному вопросу, возможно, это происходит потому, что вы уже используете bodyParser.json() в качестве промежуточного программного обеспечения, а когда вы его используете, req.body уже является объектом, и вам не нужно его анализировать снова.

Попытка синтаксического анализа уже проанализированного объекта приведет к ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...