2022年6月21日 星期二

字串轉換json 的幾種狀況

在程式內常會把json資料以text方式存到db內

當拿出來使用再轉為json使用

字串的產生 可能是由物件stringify產生

或是透過組合而成的字串

組合出要可以產生json物件的字串

可能有以下幾種狀況與錯誤


1. 字串內都是用雙引號包起來

可以直接parse成json物件

str = {"name":"oz"}

obj = JSON.parse(str)


2. 字串以單引號包起來

會發生解析錯誤,可以透過stringify把'轉成"

str = {'name':'oz'}

str = JSON.stringify(str)

obj = JSON.parse(str)


3.若單雙引號混合就無法轉成json物件

雙引號會被加上跳脫字元

單引號會轉成雙引號

str = {"name":'oz'}

str = JSON.stringify(str)

產生的字串為  {\"name\":"oz"}

這樣無法轉成json物件



express api 同時處理form與raw

express api 同時處理form與raw

寫api接收post資料可能會是raw data或form或x-www-form-urlencoded

透過header Content-Type 判斷

如果是raw conten-type會是text/plain

其他分別就會是

1. raw data

content-type==='text/plain'

raw data 無法由req.body拿到資料

必須透過

req.on('data',()=>{})接收

req.on('end',()=>{})完成接收取得完整資料

取到的完整資料會是string


2.application/x-www-form-urlencoded

content-type==='application/x-www-form-urlencoded'

直接由req.body取得資料

req.body為object物件內容


3.multipart/form-data

用來上傳檔案與資料用的

一樣可以透過req.body取到資料

但必須要有安裝multer

app.use(multer({ dest: './uploads/' }))

注意要判斷是否使用form-data

要用contentType.indexOf('multipart/form-data') !== -1 判斷

因為內容值不只multipart/form-data

 const contentType = req.get('Content-Type')  
  // 處理raw data  
  let data = ''  
 if (contentType === 'text/plain') {  
  req.setEncoding('utf8')  
  req.on('data', (chunk) => {  
   data += chunk  
  })  
  req.on('end', async() => {  
   res.send(data)  
  })  
 } else {  
  let data = req.body  
  if (typeof data === 'object') data = JSON.stringify(data)  
  res.json({ data })  
 }