JSON 对象未正确格式化为 Javascript

Posted

技术标签:

【中文标题】JSON 对象未正确格式化为 Javascript【英文标题】:JSON Object not correct formatted into Javascript 【发布时间】:2020-11-05 03:44:20 【问题描述】:

我想在 javascript 中使用 JSON 对象作为键 -> 值数组,但我不明白为什么它没有以我想要的方式返回我的对象​​:

我尝试了以下方法:

var obj = JSON.stringify(result);

var result = Object.keys(obj).map(function (key)  

    // Using Number() to convert key to number type 
    // Using obj[key] to retrieve key value 
    return [Number(key), obj[key]]; 
); 

for(var i = 0; i < result.length; i++)  
    for(var z = 0; z < result[i].length; z++)  
        console.log(result[i][z]); 
     
    
 

但我在 console.log 中得到以下行

writeback.js:159 0
writeback.js:159 "
writeback.js:159 1
writeback.js:159 
writeback.js:159 2
writeback.js:159 \
writeback.js:159 3
writeback.js:159 "
writeback.js:159 4
writeback.js:159 r
writeback.js:159 5
writeback.js:159 o
writeback.js:159 6
writeback.js:159 w
writeback.js:159 7
writeback.js:159 n
writeback.js:159 8
writeback.js:159 u
writeback.js:159 9
writeback.js:159 m
writeback.js:159 10
writeback.js:159 b
writeback.js:159 11
writeback.js:159 e
writeback.js:159 12
writeback.js:159 r
writeback.js:159 13
writeback.js:159 \
writeback.js:159 14
writeback.js:159 "
writeback.js:159 15
writeback.js:159 :
writeback.js:159 16
writeback.js:159 1
writeback.js:159 17
writeback.js:159 ,
writeback.js:159 18
writeback.js:159 \
writeback.js:159 19
writeback.js:159 "
writeback.js:159 20
writeback.js:159 I
writeback.js:159 21
writeback.js:159 D
writeback.js:159 22
writeback.js:159 \
writeback.js:159 23
writeback.js:159 "
writeback.js:159 24
writeback.js:159 :
writeback.js:159 25
writeback.js:159 1
writeback.js:159 26
writeback.js:159 
writeback.js:159 27
writeback.js:159 
writeback.js:159 28
writeback.js:159 \
writeback.js:159 29
writeback.js:159 "
writeback.js:159 30
writeback.js:159 r
writeback.js:159 31
writeback.js:159 o
writeback.js:159 32
writeback.js:159 w
writeback.js:159 33
writeback.js:159 n
writeback.js:159 34
writeback.js:159 u
writeback.js:159 35
writeback.js:159 m
writeback.js:159 36
writeback.js:159 b
writeback.js:159 37
writeback.js:159 e
writeback.js:159 38
writeback.js:159 r
writeback.js:159 39
writeback.js:159 \
writeback.js:159 40
writeback.js:159 "
writeback.js:159 41
writeback.js:159 :
writeback.js:159 42
writeback.js:159 2
writeback.js:159 43
writeback.js:159 ,
writeback.js:159 44
writeback.js:159 \
writeback.js:159 45
writeback.js:159 "
writeback.js:159 46
writeback.js:159 I
writeback.js:159 47
writeback.js:159 D
writeback.js:159 48
writeback.js:159 \
writeback.js:159 49
writeback.js:159 "
writeback.js:159 50
writeback.js:159 :
writeback.js:159 51
writeback.js:159 2
writeback.js:159 52
writeback.js:159 
writeback.js:159 53
writeback.js:159 "

似乎 JSON 对象中的每个字符都获得了一个键,但键和值在对象本身中。

UPDATE:变量result的值是

"rownumber":1,"ID":1"rownumber":2,"ID":2

有人可以帮我解决这个问题吗?

【问题讨论】:

JSON.stringify() 创建一个字符串,而不是一个对象。 如果已有对象,直接处理即可,不需要转成JSON。 也发布您的输入对象 @KunalMukherjee 我编辑了原始帖子并发布了输入对象。 有没有一种方法可以将结果的值编辑为数组中的两个正确格式的 json 对象,或者将结果组合成一个 json 对象?就目前而言,您首先需要将该字符串解析为两个对象,然后再尝试将其作为常规 json 对象进行操作。 【参考方案1】:

似乎您将Object 传递给JSON.stringify,它将对象转换为String(参见@Barmar 的第一条评论)。

换行

var obj = JSON.stringify(result);

进入

var obj = result;

=== 编辑 ===

OP更新问题后,上面的建议其实还不足以解决问题。

输入是String,内容如下:

'"rownumber":1,"ID":1"rownumber":2,"ID":2'

由于它不是有效的 JSON 字符串,因此仅使用 JSON.parse 是不够的。首先,需要将字符串拆分为 2 个单独的“对象描述”,然后将其中的每一个都传递给 JSON.parse

var splitted = result.
  split(''). // <-- split in 2
  map((partialObjectStr, i) => 
    return JSON.parse( // <-- parse into object
      i < 1 
        ? `$partialObjectStr` // <-- add right  before parsing
        : `$partialObjectStr` // <-- add left  before parsing
    );
  );

var objA = splitted[0];
var objB = splitted[1];

console.log(objA);
console.log(objB);

【讨论】:

现在我得到了相同的结果,但字符更少,因为它删除了我的 obj 变量中的所有“\”和“””符号。问题是我想作为参数给出的 obj函数的输入是一个字符串,但我需要它们作为两个单独的对象 "rownumber":1,"ID":1 rownumber: 2, ID: 2 。我该怎么做? 如果您需要准确的答案,您需要提供所有信息;-) 我的答案是基于猜测result 的初始值是多少。反过来,该猜测基于您在控制台中显示为输出的内容。请编辑您的问题,我会完善我的答案。 我发布了输入对象和值。够了吗?【参考方案2】:

如果你想在内存中改变或复制,你应该包装 JSON.parse()

var obj = JSON.parse(JSON.stringify(result));

否则只需删除 JSON.stringify()

var obj = result;

【讨论】:

完全不需要。这会将Object 转换为String,然后再转换为Object。只需省略 JSON.parseJSON.stringify 就会得到相同的结果。 @david stringify+parse 将克隆对象,而 obj=result 将指向同一个对象。 @freedomn-m 是的,从技术上讲你是正确的。但是,对于已经陈述的问题,这个解决方案并没有添加任何有助于解决问题的有价值的信息。

以上是关于JSON 对象未正确格式化为 Javascript的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 数据格式化为动态生成对象属性的 C# 对象

如何正确地将 JSON 字符串反序列化为包含另一个类的嵌套列表的类

JSON 编码的缓冲区数据未正确编码

C#使用Json

JSON

如何将 JSON 反序列化为正确类型的对象,而无需事先定义类型?