2017-08-08 60 views
1

希望你很好解析節點中的Reddits JSON。 Javascript解析器不喜歡評論

我有一個項目,我想掃描reddit.com/r/pics的JSON。拉一個隨機圖像並在網頁上顯示。

https://www.reddit.com/r/pics/.json?jsonp=1

Reddits JSON在開始拉動某些字符JSON開始之前「/ **/1(」,其是投擲關閉的Javascript解析器。

我正則表達式編輯的某些字符(見代碼),但最終失敗

SyntaxError: Unexpected string in JSON at position 1

如果我刪除這些,在本地保存文件,那麼它似乎很好地工作,並符合預期。

什麼是解決這個問題的最好方法是什麼?

我完全錯過了什麼嗎?

在此先感謝!

這裏是我的代碼,它在Node.js的

var express = require('express'); 
var router = express.Router(); 
var request = require('request'); 
var fs = require('fs'); 
const https = require('https'); 


let detailedObject; 
let pageNo = 1; 
let object; 
let lengthofObject; 
let urlImg; 
let newObject; 
var file = fs.createWriteStream("reddit.json"); 



// SAVES REDDIT.JSON TO FILE 
var request = https.get("https://www.reddit.com/r/pics/.json?jsonp=1", response => { 
    response.pipe(file); 
}); 


// RANDOM NUMBER GENERATOR 
function randomNo(num) { 
var randomNo = Math.floor(Math.random() * num) + 1 ; 
    return randomNo; 
} 


//REMOVE WEIRD CHARATCERS IN JSON 
function removeChar(object) { 

    object = object.replace(/\(/g,"").replace(/\)/g,"").replace(/\//g,"").replace(/\*/g,"").replace(/\{/g,""); 

    newObject = JSON.parse(object); 

    return newObject; 

} 


function fetchImg() { 

fs.readFile('./reddit.json', 'utf8', function (err, data) { 
    if (err) throw err; // we'll not consider error handling for now 

    if (data) { 


     data = data.trim(); 

     var storage = removeChar(data); 

     detailedObject = storage.data.children; 

     lengthofObject = detailedObject.length; 

     var randomValue = randomNo(lengthofObject); 

     urlImg = detailedObject[randomValue].data.url 

     return urlImg; 

    }; 


}); 

} 

router.get('/', (req, res, next) => { 
    //query needs to be inside function 

fetchImg(); 

return res.render('index', {"urlImg": urlImg}); 

}); 



module.exports = router; 

UPDATE

我發現這個問題,Reddits JSON被包裹在

/**/1(

和有我也錯過了JSON結尾處的右括號

)

如果我刪除所有這些,然後它解析沒有stringify。我需要弄清楚如何刪除起始5個字符(這將增加取決於頁碼的數量)和最後1個字符動態...

如果我把它全部出來,然後所有的斜槓和支架在整個查詢中刪除...

解決

一旦上傳.json已被FS下載,我馬上用切片取下前6個字符和最後一個字符。我有一個變量pageReducer減少從JSON,這取決於隨機JSON我的應用程序拉

sliceObject = object.slice(6 + pageReducer, -1); 

回答

1
//REMOVE WEIRD CHARATCERS IN JSON 
function removeChar(object) { 

    object = object.replace(/\(/g,"").replace(/\)/g,"").replace(/\//g,"").replace(/\*/g,"").replace(/\{/g,""); 

    newObject = JSON.parse(object); 

    return newObject; 

} 

的錯誤是在這裏更多的字符:newObject = JSON.parse(object);

JSON.stringify它第一次,然後你會能夠使用JSON.parse並繼續處理您的代碼。

我認爲原因是因爲「對象」參數在刪除無效字符後仍然只是一個javascript字符串,但它還不是有效的JSON可編輯對象。 JSON.stringify將其轉換爲有效的JSON字符串。 JSON.parse然後將能夠解析有效的JSON字符串。

+0

謝謝你,我今天會測試它並報告回來! – lycrake

+0

你好,我已經給了一個去。我在JSON.parse之前添加了JSON.stringify。它似乎解析字符串,但每當我嘗試安慰。將結果記錄在控制檯返回的fetchImg中。 'detailedObject = storage.data.children; ^ TypeError:無法讀取未定義的屬性'children' 看來我無法將console.log從對象中刪除.... – lycrake

+1

所以我找到了問題,將在問題中更新。尚未找到解決方案,但 – lycrake