解析有效JSON字符串时遇到问题

Facing issue while parsing valid JSON string

本文关键字:遇到 问题 字符串 JSON 有效      更新时间:2023-09-26

如何解析:

JSON.stringify({"a":JSON.stringify({"Max":"2"})});
// prints - {"a":"{'"Max'":'"2'"}"}
JSON.parse(('{"a":"{'"Max'":'"2'"}"}'))
// gives error - unexpected token M

我到底做错了什么?

更新1:

Pranav的解决方案很有效。但不知何故,我无法解析以下字符串:

var str = '{"a":"{''"PRINT''":{''"Maximum Printing Resolution''":''"4800 (horizontal)*1 x 600 (vertical) dpi''",''"Recommended Printing Area''":''"Top margin: 31.6mm     Bottom margin: 29.2mm''",''"Paper Size''":''"A4''",''"Paper Handling''":''"A4, A5, B5,''",''"Paper Weight''":''"Plain Paper: 64-105 g/m2''",''"Ink End Sensor''":''"Dot count''",''"Print Head Alignment''":''"Manual''"},''"SCAN''":{''"Scanner Type''":''"Flatbad''",''"Scanning Method''":''"CIS''",''"Optical Resolution''":''"600 x 1200dpi''",''"Selectable Resolution''":''"25 - 19200dpi''",''"Scanning Bit Depth (Input/Output)''":''"16bit / 8bit''",''"Line Scanning Speed''":''"1.2ms/line (300dpi)''",''"Scanning Speed''":''"Approx. 19secs''",''"Maximum Document Size''":''"A4 / Letter (216 x 297mm)''",''"Compatible Media''":''"Size:  A4, Letter      Type:   Plain Paper''",''"Image Quality''":''"Draft, Standard''"},''"COPY''":{''"Copy Speed''":''"Approx. 30secs''",''"Multiple Copy''":''"1 - 21 pages''"},''"General''":{''"Brand''":''"Canon''",''"Model Name''":''"PIXMA E410''",''"Functionality''":''"Multi Function''"},''"Box Contents''":{''"In the Box''":''"Power Cable , USB Cable , Manual book with CD & Cartridge''"},''"Dimensions''":{''"Dimensions - L (Cms)''":''"426''",''"Dimensions - B (Cms)''":''"306''",''"Dimensions - H (Cms)''":''"145''"},''"Warranty Period''":{''"Warranty(Years)''":''"1''"},''"Additional Features''":{},''"Compatible Cartridge''":{}}"}'
更新2:

具体代码:

var str = "{'"PRINT'":{'"Maximum Printing Resolution'":'"4800 (horizontal)*1 x 600 (vertical) dpi'",'"Recommended Printing Area'":'"Top margin: 31.6mm     Bottom margin: 29.2mm'",'"Paper Size'":'"A4'",'"Paper Handling'":'"A4, A5, B5,'",'"Paper Weight'":'"Plain Paper: 64-105 g/m2'",'"Ink End Sensor'":'"Dot count'",'"Print Head Alignment'":'"Manual'"},'"SCAN'":{'"Scanner Type'":'"Flatbad'",'"Scanning Method'":'"CIS'",'"Optical Resolution'":'"600 x 1200dpi'",'"Selectable Resolution'":'"25 - 19200dpi'",'"Scanning Bit Depth (Input/Output)'":'"16bit / 8bit'",'"Line Scanning Speed'":'"1.2ms/line (300dpi)'",'"Scanning Speed'":'"Approx. 19secs'",'"Maximum Document Size'":'"A4 / Letter (216 x 297mm)'",'"Compatible Media'":'"Size:'tA4, Letter      Type:'tPlain Paper'",'"Image Quality'":'"Draft, Standard'"},'"COPY'":{'"Copy Speed'":'"Approx. 30secs'",'"Multiple Copy'":'"1 - 21 pages'"},'"General'":{'"Brand'":'"Canon'",'"Model Name'":'"PIXMA E410'",'"Functionality'":'"Multi Function'"},'"Box Contents'":{'"In the Box'":'"Power Cable , USB Cable , Manual book with CD & Cartridge'"},'"Dimensions'":{'"Dimensions - L (Cms)'":'"426'",'"Dimensions - B (Cms)'":'"306'",'"Dimensions - H (Cms)'":'"145'"},'"Warranty Period'":{'"Warranty(Years)'":'"1'"},'"Additional Features'":{},'"Compatible Cartridge'":{}}";
str = '{"a":"'+str.replace(/"/g,''''"').replace(/'n/g,'')+'"}';
console.log(str);
console.log(JSON.parse(str));

您需要通过使用'来转义'本身,因为它在字符串中具有特殊含义。

JSON.parse(('{"a":"{''"Max''":''"2''"}"}'))

console.log(
  JSON.parse(('{"a":"{''"Max''":''"2''"}"}'))
)


UPDATE:如果你想让一个字符串到一个有效的JSON然后使用JSON.stringify方法。

var str = "{'"PRINT'":{'"Maximum Printing Resolution'":'"4800 (horizontal)*1 x 600 (vertical) dpi'",'"Recommended Printing Area'":'"Top margin: 31.6mm     Bottom margin: 29.2mm'",'"Paper Size'":'"A4'",'"Paper Handling'":'"A4, A5, B5,'",'"Paper Weight'":'"Plain Paper: 64-105 g/m2'",'"Ink End Sensor'":'"Dot count'",'"Print Head Alignment'":'"Manual'"},'"SCAN'":{'"Scanner Type'":'"Flatbad'",'"Scanning Method'":'"CIS'",'"Optical Resolution'":'"600 x 1200dpi'",'"Selectable Resolution'":'"25 - 19200dpi'",'"Scanning Bit Depth (Input/Output)'":'"16bit / 8bit'",'"Line Scanning Speed'":'"1.2ms/line (300dpi)'",'"Scanning Speed'":'"Approx. 19secs'",'"Maximum Document Size'":'"A4 / Letter (216 x 297mm)'",'"Compatible Media'":'"Size:'tA4, Letter      Type:'tPlain Paper'",'"Image Quality'":'"Draft, Standard'"},'"COPY'":{'"Copy Speed'":'"Approx. 30secs'",'"Multiple Copy'":'"1 - 21 pages'"},'"General'":{'"Brand'":'"Canon'",'"Model Name'":'"PIXMA E410'",'"Functionality'":'"Multi Function'"},'"Box Contents'":{'"In the Box'":'"Power Cable , USB Cable , Manual book with CD & Cartridge'"},'"Dimensions'":{'"Dimensions - L (Cms)'":'"426'",'"Dimensions - B (Cms)'":'"306'",'"Dimensions - H (Cms)'":'"145'"},'"Warranty Period'":{'"Warranty(Years)'":'"1'"},'"Additional Features'":{},'"Compatible Cartridge'":{}}";
str = '{"a":'+JSON.stringify(str)+'}';
//console.log(str);
console.log(JSON.parse(str));

基本上在JSON中有一个't。此字符无效。

用右转义制表符替换后,您可以解析字符串。

var s = "{'"PRINT'":{'"Maximum Printing Resolution'":'"4800 (horizontal)*1 x 600 (vertical) dpi'",'"Recommended Printing Area'":'"Top margin: 31.6mm     Bottom margin: 29.2mm'",'"Paper Size'":'"A4'",'"Paper Handling'":'"A4, A5, B5,'",'"Paper Weight'":'"Plain Paper: 64-105 g/m2'",'"Ink End Sensor'":'"Dot count'",'"Print Head Alignment'":'"Manual'"},'"SCAN'":{'"Scanner Type'":'"Flatbad'",'"Scanning Method'":'"CIS'",'"Optical Resolution'":'"600 x 1200dpi'",'"Selectable Resolution'":'"25 - 19200dpi'",'"Scanning Bit Depth (Input/Output)'":'"16bit / 8bit'",'"Line Scanning Speed'":'"1.2ms/line (300dpi)'",'"Scanning Speed'":'"Approx. 19secs'",'"Maximum Document Size'":'"A4 / Letter (216 x 297mm)'",'"Compatible Media'":'"Size:'tA4, Letter      Type:'tPlain Paper'",'"Image Quality'":'"Draft, Standard'"},'"COPY'":{'"Copy Speed'":'"Approx. 30secs'",'"Multiple Copy'":'"1 - 21 pages'"},'"General'":{'"Brand'":'"Canon'",'"Model Name'":'"PIXMA E410'",'"Functionality'":'"Multi Function'"},'"Box Contents'":{'"In the Box'":'"Power Cable , USB Cable , Manual book with CD & Cartridge'"},'"Dimensions'":{'"Dimensions - L (Cms)'":'"426'",'"Dimensions - B (Cms)'":'"306'",'"Dimensions - H (Cms)'":'"145'"},'"Warranty Period'":{'"Warranty(Years)'":'"1'"},'"Additional Features'":{},'"Compatible Cartridge'":{}}";
s = s.replace(/'t/g, '''''t');
console.log(JSON.parse(s));
console.log(s);
.as-console-wrapper { max-height: 100% !important; top: 0; }

我认为你误解了JSON的概念以及PARSE和STRINGIFY的使用。你不要 stringify一个字符串,因为你不要解析JSON对象。

在您的示例中,这正是您正在做的,您正在对字符串进行字符串化(我猜您的意思是解析它)。

:

aaa = JSON.parse({"a":JSON.stringify({"Max":"2"})});

将给aaa分配一个JSON对象,

console.log(JSON.strigify(aaa)) ;

将打印JSON的字符串版本