如何将JSON解析为小写键的对象

10

我有一些 JSON 数据,但所有的键都是大写的。如何解析它们并将键转换为小写?我正在使用 jQuery。

例如:

JSON 数据:

{"ID":1234, "CONTENT":"HELLO"}

期望的输出:

{id:1234, content:"HELLO"}

1
也许这对你有用? https://dev59.com/UGDVa4cB1Zd3GeqPgszQ - Eric Hotinger
@EricHotinger 数据非常大...我不确定它的性能是否良好。我在想,在解析时可能有其他方法可以做到。 - SwiftMango
你忘记引用HELLO了。 - Fabrício Matté
将对象的所有键转换为小写字母的最佳方法(最有效方法)是什么? - Nirvana Tikku
7个回答

16

这个怎么样:

json.replace(/"([^"]+)":/g, 
    function($0, $1) { return ('"' + $1.toLowerCase() + '":'); }
);

这个正则表达式捕获键名 $1 并将其转换为小写。

实时演示: http://jsfiddle.net/bHz7x/1/

[编辑] 为了回应 @FabrícioMatté 的评论,另一个仅匹配单词字符的演示: http://jsfiddle.net/bHz7x/4/


2
如果在属性名称中使用了转义的 ",可能无法正常工作 - 这是一个罕见的用例,但需要注意。 (fiddle - Fabrício Matté
1
@FabrícioMatté 这是一个很好的观点,在包含特殊字符的键名情况下,我们需要澄清“转换为小写”是什么意思。也许 [\w] 比 [^"] 更有意义。 - Christophe
1
属性名称后面的空格会导致其出错。例如: {"ID" :1234, "CONTENT":"HELLO"}';由于冒号前有空格,因此ID不会被转换为小写。 - Raikol Amaro
1
json.replace(/"([^"]+)"\s*:/g,function($0,$1){return ('"'+$1.toLowerCase()+'":');})); 这段代码会处理空格。 - Raikol Amaro

5

遍历属性并创建小写属性,同时删除旧的大写属性:

var str = '{"ID":1234, "CONTENT":"HELLO"}';

var obj = $.parseJSON(str);
$.each(obj, function(i, v) {
    obj[i.toLowerCase()] = v;
    delete obj[i];
});

console.log(obj);
//{id: 1234, content: "HELLO"} 

Fiddle

或者你可以直接从旧对象的属性创建一个新的对象:

var obj = $.parseJSON(str),
    lowerCased = {};
$.each(obj, function(i, v) {
    lowerCased[i.toLowerCase()] = v;
});

Fiddle

References:


如果任何键已经是小写字母,它将删除该键。 - zb'
@eicto 正确。从 OP 的问题中可以看出:“所有的键都是大写的”,所以我相信这种情况不会发生。如果可能存在小写键,则可以使用第二个解决方案,但这将覆盖一些现有属性。 - Fabrício Matté
@eicto OP的问题陈述使这变成了不可能的事情。而且无论你如何进行转换,如果使用正则表达式,最终都会得到两个名称相同的键。将该字符串解析为对象时,在Strict模式下这将返回一个更严重的解析错误,或者在非严格模式下也会覆盖现有属性。 - Fabrício Matté
我相信(不区分大小写)重复的键不在这个问题的范围内。这些需要特殊处理,很可能会破坏需要原始对象属性小写的代码。 - Fabrício Matté

1
这是一个函数:
function JSON_Lower_keys(J) {
   var ret={};
   $.map(JSON.parse(J),function(value,key){
             ret[key.toLowerCase()]=value;
   })
   return ret;
}

这是一个调用的命令:
console.log(JSON_Lower_keys('{"ID":1234, "CONTENT":"HELLO"}'))

$.map 应该返回一个包含回调函数中返回值的数组,如果你不是在构建一个 $.map 数组,那么通用迭代函数 $.each 更加合适,仅供参考。 - Fabrício Matté

0

你可以坚持使用 JavaScript 并使用 Objeck.keys()

var oldObj = { "ID":123, "CONTENT":"HI" }
var keysUpper = Object.keys(oldObj)
var newObj = {}
for(var i in keysUpper){
   newObj[keysUpper[i].toLowerCase()] = oldObj[keysUpper[i]]
}
console.log(JSON.stringify(newObj))

将以下内容复制并粘贴到您的浏览器控制台(F12)中 >> 输出:{"id":123,"content":"HI"}


不,该JSON数据是未解析的字符串。 - SwiftMango

0

0

我正在寻找一个版本,可以转换深层对象,恶意嵌套的对象。

var myObj = {
  Name: "Paul",
  Address: {
    Street: "27 Light Avenue"
    },
  City: [
    {ID:1, StateID:2, PEOPLE: ['JOHN','Franz','Dmitrj']},
        'Paris',
        {ID:3, StateID:123, PEOPLE: ['MARY','albert','PIPpo']}
  ]
}

console.log(JSON.stringify(myObj,null,4))

function ConvertKeysToLowerCase(obj) {
    if (Object.prototype.toString.apply(obj) !== '[object Array]' && Object.prototype.toString.apply(obj) !== '[object Object]') {
        return obj;
    }
    let output = {};
    for (let i in obj) {
        if (Object.prototype.toString.apply(obj[i]) === '[object Object]') {
           output[i.toLowerCase()] = ConvertKeysToLowerCase(obj[i]);
        } else if(Object.prototype.toString.apply(obj[i]) === '[object Array]'){
            output[i.toLowerCase()]=[];
            for (let j = 0; j < obj[i].length; j++) {
                output[i.toLowerCase()].push(ConvertKeysToLowerCase(obj[i][j]));
            }
        } else {
            output[i.toLowerCase()] = obj[i];
        }
    }
    return output;
};

const newObj = ConvertKeysToLowerCase(myObj)

console.log(JSON.stringify(newObj,null,4))

我修改了关于这个主题的一个重复问题的答案,https://dev59.com/PuLxs4cB2Jgan1znsLlj#36280878,该答案存在错误并且无法真正地转换数组。


0

我不擅长解释一个想法,但以下链接的库“jsonpath”https://github.com/dchester/jsonpath/允许使用正则表达式或JSONPath地址操作和过滤任何转换为JSON的JSON数据或数组。

示例1:使用要获取的值的地址显示包含在json变量中的类别:

jsonpath.query(json, '$["Bienestar"][2]');

这与我在不使用库的情况下使用 json["Bienestar"][2] 相同。 示例 2:使用 jsonpath 正则表达式显示所有类别。
jsonpath.nodes(json, '$..[?(@)]');

示例3: 将json变量中每个类别内的所有现有值转换为大写:

jsonpath.apply(json, '$..curso', function(value){return value.toUpperCase()});

对于任何小写文本,请将“toUpperCase()”更改为“toLowerCase()”。 示例4: 以上内容的示例,但使用jQuery Ajax。

/* library: https://github.com/dchester/jsonpath */
(function($){
  var json;
  var arg='balnero';
  var url='https://cedfer2.github.io/ex/c.json';
  $.ajax({
    type: 'GET',
    url: url,
    dataType: 'text',
    error: function() {
      console.log('{error!}');
    },
    beforeSend: function() {
      console.log('{cargando...(show spinner)}');
    },
    complete: function() {
      console.log('{peticionCompleta...(hide spinner)}');
    },
    success: function (data, textStatus, jqXHR) {
      console.log('success:');
      json=$.parseJSON(data);
      console.log('-------[success data: string find in json with valor in varable arg]-------');
      console.log('arg valor:' + arg);
      console.log(
        jsonpath.query(json, '$..[?(@.curso.toUpperCase().indexOf("'+arg.toUpperCase()+'")>=0)]')
        );
      console.log('-------[success data: convert string find in json uppercase with valor in varable arg]-------');
      console.log(jsonpath.apply(json, '$..[?(@.toUpperCase().indexOf("'+arg.toUpperCase()+'")>=0)]', function(value) { return value.toUpperCase() }));
      console.log('--[show new structure json in the category "Bienestar" item 2: without library js]--');
      console.log(json["Bienestar"][2]);
    }
  });
})(jQuery);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cedfer2.github.io/ex/jsonpath.min.js"></script>


仅仅是代码堆积而没有解释的答案很少会得到赞同,特别是在已经得到充分回答的七年老问题上。此外,这个答案似乎与 OP 想要的相反;也就是说,将键从大写改为小写。这个答案将值改为大写... - Heretic Monkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接