2015-12-01 3 views
0

У меня есть строка JSON, который читает:Преобразовать JSON значение строки номер

[{ 
    "id": "id2", 
    "index": "2", 
    "str": "str2", 
    "cent": "200", 
    "triplet": "222" 
}, 
{ 
    "id": "id3", 
    "index": "3", 
    "str": "str3", 
    "cent": "300", 
    "triplet": "333" 
}, 
{ 
    "id": "id4", 
    "index": "4", 
    "str": "str4", 
    "cent": "400", 
    "triplet": "444" 
}, 
{ 
    "id": "id5", 
    "index": "5", 
    "str": "str5", 
    "cent": "500", 
    "triplet": "555" 
}] 

пары ключ-значение приходят динамически с сервера, и я не буду заранее знать, какие данные следует ожидать. Для библиотеки диаграмм, которую я использую, мне нужны значения в JSON как числовые, а не строковые. "index":2 вместо "index":"2" Я должен выполнить эту манипуляцию на стороне клиента, используя чистые JS или jQuery.

Это был мой подход, но это не похоже на работу:

var temp = //some json that I receive 
var jsonForChart = jQuery.extend(true, {}, temp); 
$.each(temp, function(key, value) { 
    $.each(value, function(k, v) { 
     if(!isNaN(v)){ 
      jsonForChart[key][k] = Number(v); 
     } 
    }); 
}); 
+0

какая проблема? Вы получаете какие-либо ошибки? –

ответ

4

Что-то вроде this (где objects является массив объектов):

JavaScript

for(var i = 0; i < objects.length; i++){ 
    var obj = objects[i]; 
    for(var prop in obj){ 
     if(obj.hasOwnProperty(prop) && obj[prop] !== null && !isNaN(obj[prop])){ 
      obj[prop] = +obj[prop]; 
     } 
    } 
} 

console.log(JSON.stringify(objects, null, 2)); 

Последняя строка напечатает это:

[ 
    { 
    "id": "id2", 
    "index": 2, 
    "str": "str2", 
    "cent": 200, 
    "triplet": 222 
    }, 
    { 
    "id": "id3", 
    "index": 3, 
    "str": "str3", 
    "cent": 300, 
    "triplet": 333 
    }, 
    { 
    "id": "id4", 
    "index": 4, 
    "str": "str4", 
    "cent": 400, 
    "triplet": 444 
    }, 
    { 
    "id": "id5", 
    "index": 5, 
    "str": "str5", 
    "cent": 500, 
    "triplet": 555 
    } 
] 
+0

Это преобразует null в 0. Я просто потратил 2 часа на ошибку, вызванную этим. –

+1

@ MickaelBergeronNéron Исправлено. – Arg0n

1

Попробуйте это. Я не тестировал его, но должен работать.

var temp = //some json that I receive 
var jsonForChart = jQuery.extend(true, {}, temp); 
$.each(temp, function(key, value) { 
    $.each(value, function(k, v) { 
     if(!isNaN(parseInt(v))){ 
      jsonForChart[key][k] = parseInt(v); 
     }else{ 
      jsonForChart[key][k] = v; 
     } 
    }); 
}); 
+0

Не имеет большого значения с этим условием 'else'. Спасибо за предложение хотя :) – User528491

1

Попробуйте

// Iterate thorugh the array 
[].forEach.call(x, function(inst, i){ 
    // Iterate through all the keys 
    [].forEach.call(Object.keys(inst), function(y){ 
     // Check if string is Numerical string 
     if(!isNaN(x[i][y])) 
      //Convert to numerical value 
      x[i][y] = +x[i][y]; 
    }); 

}); 

console.log(x); 

Live FIddle

+0

Правильно работает для конвертации; как-то не получая желаемого результата с графиками. – User528491

1

Вам не нужно, чтобы проверить, если значение является числом:

var temp = [{ 
 
    "id": "id2", 
 
    "index": "2", 
 
    "str": "str2", 
 
    "cent": "200", 
 
    "triplet": "222" 
 
}, { 
 
    "id": "id3", 
 
    "index": "3", 
 
    "str": "str3", 
 
    "cent": "300", 
 
    "triplet": "333" 
 
}, { 
 
    "id": "id4", 
 
    "index": "4", 
 
    "str": "str4", 
 
    "cent": "400", 
 
    "triplet": "444" 
 
}, { 
 
    "id": "id5", 
 
    "index": "5", 
 
    "str": "str5", 
 
    "cent": "500", 
 
    "triplet": "555" 
 
}]; 
 

 
var jsonForChart = jQuery.extend(true, {}, temp); 
 
$.each(temp, function(key, value) { 
 
    $.each(value, function(k, v) { 
 
    // if the value can be parsed to int, it will be OR the value remains untouched 
 
    jsonForChart[key][k] = +v || jsonForChart[key][k]; 
 
    }); 
 
}); 
 

 
document.write("<pre>" + JSON.stringify(jsonForChart, null, 3) + "</pre>");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Вы получаете один большой объект, но это то, что вы ожидаете увидеть на линии var jsonForChart = jQuery.extend(true, {}, temp);.

Смежные вопросы