0

我有以下请求正文,我需要将其解析为 json。我需要将一个payload字段(这是一个包含很多垃圾的 json)解析为正确的 JSON 对象(它是 的结果console.log(req)):

{ payload: '{\\n  \\"taskDueDate\\": \\"No due\\",\\n  \\"oldTaskMilestone\\": null,\\n  \\"isUpdatedTask\\": \\"true\\",\\n  \\"oldTaskAssignee\\": null,\\n  \\"statusType\\": \\"OPEN\\",\\n  \\"oldTaskVisibility\\": null,\\n  \\"isEstimationUpdated\\": \\"false\\",\\n  \\"invokerEmail\\": \\"mike@domain\\",\\n  \\"oldTaskStatus\\": \\"Resolved\\",\\n  \\"projectId\\": \\"61193\\",\\n  \\"taskContent\\": \\"Add god to monit background processes\\",\\n  \\"taskAssignee\\": \\"Mike B.\\",\\n  \\"invokerId\\": \\"38073\\",\\n  \\"isLabelsUpdated\\": \\"false\\",\\n  \\"taskLabels\\": \\"Improvement\\",\\n  \\"isAssignmentUpdated\\": \\"false\\",\\n  \\"oldTaskEstimation\\": null,\\n  \\"isVisibilityUpdated\\": \\"false\\",\\n  \\"isStatusUpdated\\": \\"true\\",\\n  \\"isMilestoneUpdated\\": \\"false\\",\\n  \\"domain\\": \\"xxx\\",\\n  \\"invokerSmallAvatarURL\\": \\"xxx\\",\\n  \\"invoker\\": \\"Mike B.\\",\\n  \\"taskId\\": \\"33\\",\\n  \\"accountURL\\": \\"xx\\",\\n  \\"taskAuthor\\": \\"Mike B.\\",\\n  \\"isTimeEntryAdded\\": \\"false\\",\\n  \\"unsubscribeURL\\": \\"xxx\\",\\n  \\"oldTaskPriority\\": null,\\n  \\"oldTaskDueDate\\": null,\\n  \\"projectURL\\": \\"xxx\\",\\n  \\"taskMilestone\\": \\"Not planned\\",\\n  \\"taskPriority\\": \\"HIGH\\",\\n  \\"taskTitle\\": \\"Start using god gem\\",\\n  \\"oldTaskLabels\\": null,\\n  \\"isPriorityUpdated\\": \\"false\\",\\n  \\"taskURL\\": \\"xxx\\",\\n  \\"taskStatus\\": \\"Open\\",\\n  \\"subdomain\\": \\"xx\\",\\n  \\"invokerProfileURL\\": \\"xx\\",\\n  \\"statusLabel\\": \\"reopened\\",\\n  \\"taskEstimation\\": \\"Not estimated\\",\\n  \\"isNewTask\\": \\"false\\",\\n  \\"isAttachmentsUpdated\\": \\"false\\",\\n  \\"projectName\\": \\"xx\\",\\n  \\"taskVisibility\\": \\"ALL\\",\\n  \\"isDueDateUpdated\\": \\"false\\"\\n}' }

为此,我使用以下代码:

payload = req.body['payload']
JSON.parse(payload)

这样的代码给了我一个错误:

Syntax error: unexpected token \

有趣的是,当我将payloadvar 的内容转储到控制台并使用 Chrome 开发控制台将其传递时JSON.parse(my_copied_json_string),它工作得很好。

你能告诉我为什么会这样吗?我能做些什么来理解和解决这个奇怪的问题?


JSFiddle 演示该问题:http: //jsfiddle.net/7PZD9/5/

4

5 回答 5

1

您的 JSON 被转义了两次。

如果你真的需要解析这些数据,你可以这样做:

JSON.parse(JSON.parse('"' + payload + '"'))

于 2014-02-13T03:26:14.697 回答
1

这个确实有效。这不是最漂亮的,因为我过滤了几次。事实是你的 json 字符串有很多垃圾。

string = '{\\n  \\"taskDueDate\\": \\"No due\\",\\n  \\"oldTaskMilestone\\": null,\\n  \\"isUpdatedTask\\": \\"true\\",\\n  \\"oldTaskAssignee\\": null,\\n  \\"statusType\\": \\"OPEN\\",\\n  \\"oldTaskVisibility\\": null,\\n  \\"isEstimationUpdated\\": \\"false\\",\\n  \\"invokerEmail\\": \\"mike@domain\\",\\n  \\"oldTaskStatus\\": \\"Resolved\\",\\n  \\"projectId\\": \\"61193\\",\\n  \\"taskContent\\": \\"Add god to monit background processes\\",\\n  \\"taskAssignee\\": \\"Mike B.\\",\\n  \\"invokerId\\": \\"38073\\",\\n  \\"isLabelsUpdated\\": \\"false\\",\\n  \\"taskLabels\\": \\"Improvement\\",\\n  \\"isAssignmentUpdated\\": \\"false\\",\\n  \\"oldTaskEstimation\\": null,\\n  \\"isVisibilityUpdated\\": \\"false\\",\\n  \\"isStatusUpdated\\": \\"true\\",\\n  \\"isMilestoneUpdated\\": \\"false\\",\\n  \\"domain\\": \\"xxx\\",\\n  \\"invokerSmallAvatarURL\\": \\"xxx\\",\\n  \\"invoker\\": \\"Mike B.\\",\\n  \\"taskId\\": \\"33\\",\\n  \\"accountURL\\": \\"xx\\",\\n  \\"taskAuthor\\": \\"Mike B.\\",\\n  \\"isTimeEntryAdded\\": \\"false\\",\\n  \\"unsubscribeURL\\": \\"xxx\\",\\n  \\"oldTaskPriority\\": null,\\n  \\"oldTaskDueDate\\": null,\\n  \\"projectURL\\": \\"xxx\\",\\n  \\"taskMilestone\\": \\"Not planned\\",\\n  \\"taskPriority\\": \\"HIGH\\",\\n  \\"taskTitle\\": \\"Start using god gem\\",\\n  \\"oldTaskLabels\\": null,\\n  \\"isPriorityUpdated\\": \\"false\\",\\n  \\"taskURL\\": \\"xxx\\",\\n  \\"taskStatus\\": \\"Open\\",\\n  \\"subdomain\\": \\"xx\\",\\n  \\"invokerProfileURL\\": \\"xx\\",\\n  \\"statusLabel\\": \\"reopened\\",\\n  \\"taskEstimation\\": \\"Not estimated\\",\\n  \\"isNewTask\\": \\"false\\",\\n  \\"isAttachmentsUpdated\\": \\"false\\",\\n  \\"projectName\\": \\"xx\\",\\n  \\"taskVisibility\\": \\"ALL\\",\\n  \\"isDueDateUpdated\\": \\"false\\"\\n}'

fixed_backslashes = string.replace(/([^\/])\/([^\/])/g,"$1//$2")
fixed_backslashes = fixed_backslashes.replace(/\\n/g,"")
fixed_backslashes = fixed_backslashes.replace(/\\/g,"")
console.log(fixed_backslashes)

parsed = JSON.parse(fixed_backslashes)
console.log(parsed)

基本上摆脱了所有反斜杠和换行符。

于 2014-02-12T17:43:07.620 回答
1

这是一个正在工作的 jsfiddle:http: //jsfiddle.net/7PZD9/7/

我首先用空白替换了所有新行字符,然后用空白替换了反斜杠。如果您的字符串中可能有反斜杠,那么您将需要一个我无法编写的更强大的正则表达式。

var fixed_backslashes = string.replace(/\\n/g, "");
fixed_backslashes = fixed_backslashes.replace(/\\/g,"")
于 2014-02-12T17:15:47.867 回答
0

可能您只需要剥离“有效负载” => (以及最后的对应部分),以便您的字符串是

"{\n  \"accountURL\": \"https://domain.com\",\n  \"newCommitsCount\": \"1\",\n  \"pushURL\":\"https://domain.com/project/64249/git/source/compare/revisions/0b6438955f2a5a7981fd25cfa5b48fe3fb4c888d,7771e638d1356a14d1dc46f3f5cfaab858370a5e\",\n  \"unsubscribeURL\": \"https://domain.com:443/unsubscribe?token=receiverToken&type=COMMITS&projectId=64249\",\n  \"invokerEmail\": \"email@email.com\",\n  \"projectURL\": \"https://domain.com/project/64249\",\n  \"projectId\": \"64249\",\n  \"afterPushRevision\": \"7771e638d1356a14d1dc46f3f5cfaab858370a5e\",\n  \"invokerId\": \"38074\",\n  \"pushDate\": \"2014-02-11T15:26:36+0000\",\n  \"beforePushRevision\": \"0b6438955f2a5a7981fd25cfa5b48fe3fb4c888d\",\n  \"repositoryURL\": \"git_url\",\n  \"subdomain\": \"subdomain\",\n  \"domain\": \"domain\",\n  \"branch\": \"develop\",\n  \"invokerProfileURL\": \"url\",\n  \"commitsCount\": \"1\",\n  \"invokerSmallAvatarURL\": \"xx\",\n  \"projectName\": \"NAME\",\n  \"invoker\": \"Invoker Name.\",\n  \"commits\": {\"commit\":   {\n    \"revision\": \"7771e638d1356a14d1dc46f3f5cfaab858370a5e\",\n    \"commitMessage\": \"quickfix\",\n    \"committerId\": \"38074\",\n    \"committerEmail\": \"email\",\n    \"committerName\": \"Name.\",\n    \"commitDate\": \"2014-02-11T15:26:27+0000\",\n    \"commitURL\": \"https://domain.com/project/64249/git/source/commit/develop/7771e638d1356a14d1dc46f3f5cfaab858370a5e\"  }}}"
于 2014-02-12T16:37:11.757 回答
0

这不应该是 nodeJS 问题;Chrome 和 nodeJS 使用相同的 JavaScript 引擎,因此如果在 chrome 上运行,它也应该在 nodeJS 上运行;

我尝试通过命令行解析节点中的上述 JSON 字符串,并且成功了。我认为在上面的字符串最终到达节点之前有一些东西会修改它。

于 2014-02-12T16:21:29.050 回答