简体   繁体   中英

Javascript parse JSON error, but works fine in validator

When I try to parse this 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
      }
    ]
  }
}

Using this code:

var parsed = JSON.parse(req.body)

I get this error:

SyntaxError: Unexpected token o in JSON at position 1

But if I use a website such as

https://jsonformatter.curiousconcept.com

To validate the JSON, it says the JSON is valid. What is wrong here?

UPDATE

I'm using an express server to simulate discord server, so it sends web hooks to the express server instead, I get the JSON using req.body.

This happens because JSON is a global object (it's the same object where you read the method parse !), so when you invoke JSON.parse(JSON) javascript thinks you want to parse it.

The same thing doesn't happen when you pass the variable to the validator, because it will be assigned to a local variable:

let JSON = "{}";

validate(JSON);

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

EDIT

According to your updated question, maybe it happens because you already use bodyParser.json() as middleware, and when you use it, req.body is already an object and you don't need to parse it again.

Trying to parsing an already parsed object will throw an error.

It would be something like without using 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())
    })
})

For using it with JSONStream, it would be something like:

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

(OR)

Here is the Some Steps for this issue..

You Can use lodash for resolving this.

import the lodash and call unescape().

const _ = require('lodash');

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

htmlDecoder(JSON);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM