展平JSON但保留原始属性

时间:2018-01-24 06:56:57

标签: json

我试图压缩JSON对象的属性(即对象,数组),但保持原始属性不变,并将非标量属性转换为字符串。

(我这样做是因为当我使用flat npm包时,数组/对象被展平,但是对象键被''包围,就像在'task_status.0.data'中一样,并且没有存入AzureTables)。如果有办法解决这个问题并对其进行解串,那么它也是一个很好的解决方案......)

以下是您可以在jsfiddle.net上运行的示例

var obj1 = {
    "studentId": "abc",
    "task_status": [
            {
                "status":"Current",
                "date":516760078
            },
            {
                "status":"Late",
                "date":1516414446
            }
        ],
    "student_plan": "n"
 }

FlattenJson = function(obj){
    keys = Object.keys(obj);
    var newObj = {};
    for(var i=0; i<keys.length; i++){
        var theType = typeof(obj[keys[i]]);
    console.log(theType);
        if(theType === 'array' || theType === 'object'){
        console.log(JSON.stringify(obj[keys[i]]));
            newObj[keys[i]] = "\"" + JSON.stringify(obj[keys[i]]) + "\"";
        }
        newObj[keys[i]] = obj[keys[i]];
    }
    return newObj;
}

var newObj1 = FlattenJson(obj1);
console.log(newObj1, obj1);

但是,newobj1包含相同的原始数组,而不是字符串。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:-1)

更新:感谢this您有solution

var obj1 = {
    "studentId": "abc",
    "task_status": [
            {
                "status":"Current",
                "date":516760078
            },
            {
                "status":"Late",
                "date":1516414446
            }
        ],
    "student_plan": "n"
 }

function customToString (obj) {
    var str = '{';
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            str += prop + ':"' + obj[prop] + '",';
        }
    }
    return str.replace(/.$/,'') + '}';
}

var flattenObject = function(ob) {
    var toReturn = {};

    for (var i in ob) {
        if (!ob.hasOwnProperty(i)) continue;

        if ((typeof ob[i]) == 'object') {
            var flatObject = flattenObject(ob[i]);
            for (var x in flatObject) {
                if (!flatObject.hasOwnProperty(x)) continue;

                toReturn[i + '.' + x] = flatObject[x];
            }
        } else {
            toReturn[i] = ob[i];
        }
    }
    return toReturn;
};

var newObj1 = flattenObject(obj1);
console.log(newObj1, obj1);
document.write(customToString(newObj1));