【问题标题】:Can’t access unicode keys. Possibly, Javascript JSON parser bug?无法访问 unicode 密钥。可能是 Javascript JSON 解析器错误?
【发布时间】:2021-06-23 15:00:38
【问题描述】:

我有一个 json 字符串,它有 Unicode 键:

{"Текст":"Text"}

我可以成功地JSON.parse 它然后JSON.stringify - 它会是一样的。

我无法访问Текст 密钥;它是未定义的:

JSON.parse('{"Текст":"Text"}')["Текст"] // undefined

我无法通过Object.keys() 获取密钥,它返回 0。

我尝试在解析之前在字符串中转义Unicode,甚至在尝试访问键时在括号中转义Unicode,但没有帮助。


页面有

<meta charset="utf-8">

Json 字符串由 php 的 echo 返回。 php代码有开头

header('Content-Type: text/html; charset=utf-8');

字符串本身可以正确显示。


更新

我将所有脚本的内容类型更改为纯文本(不幸的是,不能使用 pc 和 devtools),以查看 json 字符串如何echo。它被转义了:

...,"\u041d\u0430\u0447\u0430\u043b\u043e":"some value",...

更新 2

我将转义的 unicode 更改为仅 unicode,但仍然面临问题

更新 3

我认为这确实是一个错误。正如我上面写的,从 unicode 字符串解析的 json 对象是绝对有效的。我无法访问它的密钥,但如果我 stringify 它,它将返回一个有效的字符串。

我想:“如果解析然后设置密钥,那应该在那里?”。我做到了——没有任何改变。还有更多——添加任何键都不会影响 json 对象。当我对它进行字符串化时,它返回一个原始字符串,没有任何更改。

【问题讨论】:

  • 无法复制,JSON.parse('{"Текст":"Text"}')["Текст"] 为我工作。
  • @ASDFGerte,确实,我也是。那么可能是什么问题????
  • 你只能将这个逻辑推到它破坏代码的地步,但它可以工作,只是因为键是一个字符串标识符。
  • 让 e = JSON.parse('{"Текст":"Text"}'); console.log(e["Текст"]);有效吗?
  • 我建议调试代码,并检查它的每一部分(看看字符串是什么,看看对JSON.parse 的调用是什么,等等)。有点奇怪,JSON.parse 给出了一个空对象,如果字符串被破坏,我会预料到一个异常。

标签: javascript json unicode key


【解决方案1】:

由于原生 JSON 东西不起作用,我已经制定了自己的解决方案来设置/获取 json 密钥:

function JSONget(j, k)
{
var i = j.search('"'+k+'"');

if(i == -1)
return j;

i+=k.length;

while(j[i] != ':' && i < j.length)
i++;

i++;

if(j[i]=='"')
i++;

var buffer = [];

for(var a=0; i < j.length; i++, a++)
{
if((j[i]=='"'&&j[i-1]!='\\')||(j[i]==','&&j[i+1]=='"'))
    break;
    
buffer[a] = j[i];
}

return buffer.join('');
}


function JSONset(j, k, v)
{
var i = j.search('"'+k+'"');

if(i == -1)
return j;

i+=k.length;

while(j[i] != ':' && i < j.length)
i++;

i++;

if(j[i]=='"')
i++;

var buffer = [];

for(var a=0; i < j.length; i++, a++)
{
if((j[i]=='"'&&j[i-1]!='\\')||(j[i]==','&&j[i+1]=='"'))
    break;
    
buffer[a] = j[i];
}

var t = j.split('"'+k+'"');

t[1] = t[1].replace(buffer.join(''), v);

return t[0]+('"'+k+'"')+t[1];
}

使用

JSONget('{"Текст":"Text"}', "Текст") // Text
JSONset('{"Текст":"Text"}', "Текст", "Latin vs Cyrillic") // "Текст":"Latin vs Cyrillic"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2023-01-24
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多