簡體   English   中英

JSON.stringify不轉換數組

[英]JSON.stringify does not convert arrays

我知道我以錯誤的方式解決了這個問題,老實說這可能是因為我錯誤地處理了遞歸,但如果是這樣的話,我不確定我哪里出錯了。 這是示例的鏈接。

這是JavaScript -

function propertyTest(currentObject, key) {
    for (var property in currentObject) {
        if (typeof currentObject[property] === "object") {
            propertyTest(currentObject[property], property);
        } else {
            // this is only to test the output
            $('#method1').append((property == 'value' && key ? key : property) + ' -- ' + currentObject[property] + '<br />');
            propertyKey = (property == 'value' && key ? key : property);
            propertyValue = currentObject[property];
            var arrayJSON = [];
            arrayJSON.push(propertyKey);
            arrayJSON.push(propertyValue);
        }
    }
    var JSONString = JSON.stringify(arrayJSON);
    console.log(JSONString);
    return JSONString;
}

這是原始的JSON -

var oarsObject = [{
    "coordinateReferenceSystem": "26782,15851",
    "positionReferenceType": "geogWgs84",
    "geogWgs84": {
        "latitude": {
            "value": 0.50507158458214041
        },
        "longitude": {
            "value": -1.604064725846865
        },
        "height": {
            "value": 0.0
        }
    }
}, {
    "coordinateReferenceSystem": "26782,15851",
    "positionReferenceType": "geogWgs84",
    "geogWgs84": {
        "latitude": {
            "value": 0.50509265195620767
        },
        "longitude": {
            "value": -1.5961047836759397
        },
        "height": {
            "value": 0.0
        }
    }
}, {
    "coordinateReferenceSystem": "26782,15851",
    "positionReferenceType": "geogWgs84",
    "geogWgs84": {
        "latitude": {
            "value": 0.4963464715653228
        },
        "longitude": {
            "value": -1.5960947041991222
        },
        "height": {
            "value": 0.0
        }
    }
}, {
    "coordinateReferenceSystem": "26782,15851",
    "positionReferenceType": "geogWgs84",
    "geogWgs84": {
        "latitude": {
            "value": 0.49632551101280209
        },
        "longitude": {
            "value": -1.604015267530267
        },
        "height": {
            "value": 0.0
        }
    }
}]

JSON按照您的預期發送到函數 -

propertyTest(oarsObject);

以下是從軌道上掉下來的證據,來自控制台的一個片段 -

["latitude",0.5050715845821404]
["longitude",-1.604064725846865]
["height",0]
undefined
["positionReferenceType","geogWgs84"]
["latitude",0.5050926519562077]
["longitude",-1.5961047836759397]
["height",0]
undefined

注意前兩個項目最初是如何出現在日志中的,然后只是positionReferenceType 另請注意未定義的 JSON字符串。 我確定這是因為我的遞歸是錯誤的。

我知道JavaScript數組在閱讀其他幾篇文章后需要數字鍵但我很好奇。 JSON.stringify()似乎適用於其中一些而不是其他。 此外,結果是不一致的,在第一輪positionReferenceType確實被字符串化之后,雖然顯然是錯誤的順序(再次,我確信這是因為我的遞歸努力是關閉的)。

這個用例是雙重的。 首先,我們要刪除由此時無法修改的系統的一部分生成的原始JSON的不必要的“值”鍵。 其次,系統的其他部分使用我們希望從這樣的函數輸出的離散的較小JSON位。 輸出應該是小的,單獨的JSON字符串(類似於HTML輸出中顯示的)。 輸出應該是單個JSON字符串,由單個鍵/值對組成,如下例所示。

[
    {
        "coordinateReferenceSystem": "26782,15851"
    },
    {
        "positionReferenceType": "geogWgs84"
    },
    {
        "latitude": 0.5050715845821404
    },
    {
        "longitude": -1.604064725846865
    },
    {
        "height": 0
    }
]

我甚至沒有接近組裝整個JSON字符串的點,因為我只是試圖正確地解決對。

我確定我在這里忽略了一些東西。 我應該創建一個對象,而不是一個數組來獲取所有字符串化嗎? 或者,除了我認為是我提到的明顯問題之外,我的遞歸中有什么東西絆倒我?

通常,有兩種方法可以重復並獲得單個扁平數組。

  • 首先將結果數組作為參數傳遞,每次重復將添加到它。
  • 第二個是每個調用返回一個數組,上層添加到它自己的結果。

無論哪種方式,您都需要先測試Array主題,然后檢查Object subject,因為Array是Object,通常您會想要為它們做不同的事情。

此外,通常您將在遞歸之外處理結果(例如,轉換為JSON然后記錄),以保持遞歸簡短。

這是使用第一種方法的實現,包括頂層的JSON轉換。 我盡可能重用你的變量名。

 function propertyTest( currentObject, array, key ) { var result = array || [], o; if ( Array.isArray( currentObject ) ) { currentObject.forEach( function ( e ) { propertyTest( e, result ); } ); } else if ( typeof ( currentObject ) === 'object' ) { if ( 'value' in currentObject && Object.keys( currentObject ).length === 1 ) { propertyTest( currentObject.value, result, key ); } else { for ( var property in currentObject ) { propertyTest( currentObject[ property ], result, property ); } } } else { result.push( o = {} ); o[ key ] = currentObject; } return array === undefined ? JSON.stringify( result ) : result; } var oarsObject = [{ "coordinateReferenceSystem": "26782,15851", "positionReferenceType": "geogWgs84", "geogWgs84": { "latitude": { "value": 0.50507158458214041 }, "longitude": { "value": -1.604064725846865 }, "height": { "value": 0.0 } } }, { "coordinateReferenceSystem": "26782,15851", "positionReferenceType": "geogWgs84", "geogWgs84": { "latitude": { "value": 0.50509265195620767 }, "longitude": { "value": -1.5961047836759397 }, "height": { "value": 0.0 } } }, { "coordinateReferenceSystem": "26782,15851", "positionReferenceType": "geogWgs84", "geogWgs84": { "latitude": { "value": 0.4963464715653228 }, "longitude": { "value": -1.5960947041991222 }, "height": { "value": 0.0 } } }, { "coordinateReferenceSystem": "26782,15851", "positionReferenceType": "geogWgs84", "geogWgs84": { "latitude": { "value": 0.49632551101280209 }, "longitude": { "value": -1.604015267530267 }, "height": { "value": 0.0 } } }]; alert( propertyTest( oarsObject ) ); 

您可能希望將結果數組的范圍限制在遞歸函數之外,如Sheepy所述。

使用forEach當它是一個數組值和for當它是對象中的對象。 這樣,您只需處理一個對象的推送而無需維護該數組。

示例jsFiddle

var arrayJSON = [];

function propertyTest(currentObject, key) {

    if (Array.isArray(currentObject)) {
        currentObject.forEach(propertyTest);
    } else {
        for (var returnKey in currentObject) {

            if (typeof currentObject[returnKey] === 'object') {
                propertyTest(currentObject[returnKey], returnKey);
            } else {
                var newKey = (returnKey === 'value' && key) ? key : returnKey;
                var newObj = {};
                newObj[newKey] = currentObject[returnKey];
                arrayJSON.push(newObj);

                $('#method1').append( newKey + ' -- ' + currentObject[returnKey] + '<br />');
            }
        }
    }
}

propertyTest(oarsObject);
console.log(JSON.stringify(arrayJSON););

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM