【问题标题】:Removing excess comma on JSON Object删除 JSON 对象上多余的逗号
【发布时间】:2015-09-05 06:26:37
【问题描述】:

目前正在努力消除我在下面的 json 对象上多余的“,”逗号。

{"rules": {
    "1000": {
        "action": "2",
        "category": "skype",
        "entity": "Private",
        "id": "1000",
    },
    "1200": {
        "action": "2",
        "category": "http",
        "entity": "Public",
        "id": "1200",
    },
    "100": {
        "action": "2",
        "category": "ftp",
        "entity": "Public",
        "id": "100",
    },
    "0": {
        "entity": "Private",
        "category": "alcohol, tobacco",
        "action": "1",
        "id": "low",
    },
    "3000": {
    } }}

也许您对使用 AngularJS 消除它的最简单方法有一些见解。

数据是从这段代码sn-p解析出来的。

var request = {
                url: 'sample/uri',
                method: "GET",
                transformResponse: specialTransform
            };


            var response = $q.defer( );
                $http( request ).success( function( THIS DATA -> data, status ) {

【问题讨论】:

  • 您是在 Angular 中生成该 JSON 还是从某个外部来源接收它?
  • 我已经编辑了@Blaise 的问题

标签: json angularjs


【解决方案1】:
  1. 评估

    var fixTrailingCommas = function (jsonString) {
        var jsonObj;
        eval('jsonObj = ' + jsonString);
        return JSON.stringify(jsonObj);
    };
    
    fixTrailingCommas('{"rules": { "1000": { "action": "2", "category": "skype", "entity": "Private", "id": "1000" ,   } } }');
    

    仅当您完全信任传入的 json 时,请在此处使用 eval,并注意 MDN 中描述的其他 eval 邪恶及其关于 JSON 解析的说明

    请注意,由于 JSON 语法与 JavaScript 语法相比受到限制,因此许多有效的 JavaScript 文字不会被解析为 JSON。例如,JSON 中不允许使用尾随逗号,并且对象文字中的属性名称(键)必须用引号引起来。请务必使用 JSON 序列化程序来生成稍后将被解析为 JSON 的字符串。

  2. 您也可以选择依赖on implementation of JSON2 by Douglas Crockford,它在内部使用eval

    在当前的浏览器上,这个文件什么都不做, 更喜欢内置的 JSON 对象。没有理由使用这个文件,除非 命运迫使你支持IE8,这是任何人都不应该做的事情 必须再做一次。

    但是因为我们确实需要使用这个库,所以我们必须做一些代码修改,例如简单地注释掉 JSON 类型检查,然后它会覆盖原生浏览器对象(或者我们也可以引入新的 JSON2 全局变量)

    //if (typeof JSON !== 'object') {
        JSON = {};
    //}
    

    附:其他解析函数json_parse.jsjson_parse_state.js,不使用eval,抛出语法错误

  3. 角部分

    var config = {
        transformResponse: function (data, headers) {
            if(headers("content-type") === "application/json" && angular.isString(data)) {
    
                try {
                    data = JSON.parse(data);
                } catch (e) {
                    // if parsing error, try another parser
                    // or just fix commas, if you know for sure that the problem is in commas
                    data = JSON2.parse(data);
                }
    
                return data;
    
            } else {
                return data;
            }
        }
    };
    
    $http.get("rules.json", config).success(function (data) {
        $scope.rules = data;
    });
    

【讨论】:

  • 一个切割器解决方案,但存在安全和性能问题:stackoverflow.com/questions/86513/…
  • 同意,应该明智地使用它,如果源 apis 返回受信任的 json。 JSON.js之前用eval解析json(需要找个证明,但我清楚记得在2010年某处挖过它的源代码)
【解决方案2】:

所以正如你所说,JSON 是在你从中获取它的服务器上错误地生成的,你能改变它在那里生成的方式吗? (关注这个:Can you use a trailing comma in a JSON object?

如果你不能这样做,你需要使用这里提到的东西:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    相关资源
    最近更新 更多