2017-08-09 256 views
1

我想解析一个JSON对象,它包含一些json字符串的值,注意我之前不知道这些字段,所以我不能做类似 obj[key]=JSON.parse(obj[key])的东西。我在寻找一个简单的方法来做到这一点,解析包含Json字符串的JSON对象

obj={ 
    Name:"{\"FirstName\":\"Douglas\",\"LastName\":\"Crockford\"}" 
} 

我想

{ 
    Name:{ 
     FirstName:"Douglas", 
     LastName:"Crockford" 
     } 
} 

回答

0

我们将编写一个方便的小工具,它的功能在对象的属性映射:

function mapObject(obj, fn) { 
    const result = {}; 
    for (const prop in obj) result[prop] = fn(obj[prop], prop); 
    return result; 
} 

现在,您可以创建一个对象,其中解析的输入中的所有JSON值只需说

mapObject(obj, JSON.parse) 

如果你想防止属性值不属于有效的JSON,然后

function parseJSON(x) { 
    try { return JSON.parse(x); } 
    catch (e) { return x; } 
} 

然后

mapObject(obj, parseJSON) 
0

你可以使用Object.keys(obj)获得的属性名称,以便您可以使用JSON.parse()

+0

是啊,谢谢,我认为我可以有更漂亮的解决方案,但我看到这是我能做的 – nadhem

+0

,我必须使用try和catch,以防某些值不是json格式 – nadhem

0

你可以随时尝试/传递每个键:

a = { 
 
    a: 1, 
 
    b: JSON.stringify({a: 1, b: 2}), 
 
    c: 'asdf' 
 
} 
 
console.log(a); 
 
new_a = {} 
 
Object.keys(a).map((key) => { 
 
    try { 
 
    new_a[key] = JSON.parse(a[key]); 
 
    } catch(err) { 
 
    new_a[key] = a[key]; 
 
    } 
 
}) 
 

 
console.log(new_a);

+0

纯粹主义者会说这是滥用'map',应该是'forEach'。他们的逻辑是'map'被设计用于将一个数组转换为另一个数组,并且不应该被用于其副作用,比如改变输入。 – 2017-08-10 03:12:35

+0

我会用foreach做到这一点,它更方便 – nadhem

0

你可以简单地遍历所有的键:

obj={ 
 
    Name: "{\"FisrtName\":\"Douglas\",\"LastName\":\"Crockford\"}", 
 
    Other: "This isn't JSON" 
 
}; 
 
for (var key in obj) { 
 
    try { 
 
     obj[key] = JSON.parse(obj[key]); 
 
    } catch(err) { 
 
     // ignore error, just leave it alone 
 
    } 
 
} 
 
console.log(obj);

+0

如果某些值无效json字符串会出现问题 – Dekel

+0

我认为所有的值都是JSON,没有在问题中看到“some”。 – Barmar

+0

来自问题; “请注意,我以前不知道这些字段,所以我不能像obj [key] = JSON.parse(obj [key])那样做。” – Dekel

0

如果你想要得到似是而非的话,你可以处理此场景使用"reviver parameter"的任意嵌套版本。由您的对象开始stringifying

function parseJSON(k,v) { 
    try { return JSON.parse(v, parseJSON); } 
    catch(e) { return v; } 
} 
JSON.parse(JSON.stringify(obj), parseJSON); 

是那么漂亮,还是只是我?