2016-12-20 48 views
2

我是從服務器fetch ING數據和我收到如下回應:解析與子元素JSON對象不順心

{"Sections[0].Title":"SectionsTitleText","Title":"TitleText"} 

我希望它成爲這樣一個對象:

{Sections: [{Title:"SectionTitleText"}], Title: "TitleText"} 

而是我有這樣的:

{Sections[0].Title: "SectionsTitleText","Title":"TitleText"} 

其中Sections[0].Title是一個單一的財產名稱,而不是一個對象數組。有沒有辦法解決它?

+0

到底是什麼的問題;服務器是以錯誤的格式發送數據還是實際上想要更改接收的對象? – Randy

+0

@Randy我不能影響數據的發送方式,所以我的目標是以'Sections [0] .Title'被視爲數組而不是屬性名稱的方式解析這個對象。 – Anarion

+0

你是如何得到第三個例子的?因爲那在JS或JSON中不是有效的。 – Randy

回答

3

您可以使用一個函數將路徑拆分爲值併爲其生成新的對象或數組。

function setValue(object, path, value) { 
 
    var way = path.replace(/\[/g, '.').replace(/\]/g, '').split('.'), 
 
     last = way.pop(); 
 

 
    way.reduce(function (o, k, i, kk) { 
 
     return o[k] = o[k] || (isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {}); 
 
    }, object)[last] = value; 
 
} 
 

 
var obj = { 'Sections[0].Title': 'SectionsTitleText', Title: 'TitleText' }; 
 

 
Object.keys(obj).forEach(function (key) { 
 
    var value = obj[key]; 
 
    delete obj[key]; 
 
    setValue(obj, key, value); 
 
}); 
 

 
console.log(obj);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

工程像魅力,謝謝!正是我需要的。 – Anarion

1

JSON.parse工作正常,事實上並沒有出錯。你的JSON字符串表示創建一個名爲Sections[0].Title的字段的JavaScript對象;如果你不想這樣做,那麼你不能使用JSON.parse(這是什麼jQuery.ajax()axios()或任何將在引擎蓋下使用,除非你另有指定)。

由於您沒有提及您在代碼中使用的傳輸庫,我們只能猜測哪些內容會對您有幫助。但是,如果您使用jQuery.ajax(),請嘗試爲text/json設置不同的converter。如果您使用的是axios,請嘗試在您的request object中指定transformRequest

+0

我正在使用vanilla'fetch' – Anarion

0
  1. 可以使用JSON.parse方法

  2. 然後使用陣列map方法根據需要對陣列映射解析JSON爲Javascript。

+1

這不起作用,如果解析對象,則鍵和數組索引將組合爲鍵。 – Randy

+0

分離和新密鑰的邏輯需要在'map'函數中。 – Agalo