การแปลงสตริงเป็นวัตถุ JSON


148

คุณทำให้ JS คิดว่าสตริงเป็น JSON ได้อย่างไร

ฉันมีฟังก์ชั่นที่ใช้งานได้ก็ต่อเมื่อวัตถุ JSON ผ่านไปแล้ว ถ้าฉันส่งสตริงไปด้วยรูปแบบเดียวกับ JSON มันจะไม่ทำงาน ดังนั้นฉันอยากให้ฟังก์ชั่นนั้นคิดว่าสตริงที่ส่งผ่านไปคือ JSON สตริงนั้นอยู่ในรูปแบบ JSON

ฉันยังลองต่อไปนี้ ฉันป้อนสตริงผ่าน Ajax โดยมีพารามิเตอร์ "handle as" เป็น "JSON" และเมื่อฉันส่งผลลัพธ์ไปยังฟังก์ชันที่ใช้งานได้

ดังนั้นฉันจึงอนุมานปัญหาไม่ได้อยู่กับสตริง ฉันจะแปลงสตริงนี้เป็น JSON ได้อย่างไร ถ้าฉันได้รับสายเดียวกันผ่านการร้องขอ ajax แล้วส่งผ่านไปยังฟังก์ชั่นการทำงานในขณะที่ผ่านโดยตรงมันไม่ทำงาน

สตริงมีดังนี้:

  {
     "data": [
   {
  "id": "id1",
      "fields": [
        {
          "id": "name1",
          "label": "joker",
          "unit": "year"
        },
         {"id": "name2", "label": "Quantity"},
    ],
      "rows": [    data here....

and closing braces..


2
ชื่อของคุณทำให้เข้าใจผิด จากเนื้อหาของคำถามของคุณฉันอยากบอกว่าคุณต้องการแปลงสตริงที่มี JSON เป็นวัตถุ / อาร์เรย์ JavaScript
เฟลิกซ์คลิง

ตกลงฉันแก้ไขมัน มี \ n ในสตริง ตอนนี้ต้องคิดหาวิธีการใช้ JSON.parse กับสิ่งนี้
Zer0

ตกลงฉันแก้ไขมัน ไปที่jsonlint.comและใส่สายของคุณที่นั่น หากระบุว่าถูกต้องคุณสามารถใช้ JSONParse เพื่อให้ได้ผลลัพธ์ที่เหมือนกัน
Zer0

ในกรณีที่ทุกคนอ่านสิ่งนี้ชื่อควรจะเป็น "การแปลงสตริง JSON เป็นวัตถุ"
Chris G

คำตอบ:


353
var obj = JSON.parse(string);

stringสตริง json ของคุณอยู่ที่ไหน


สิ่งนี้ไม่ทำงาน กำลังส่งข้อผิดพลาด "SyntaxError: JSON.parse: อักขระที่ไม่คาดคิด" ไม่มีอะไรผิดปกติกับสายอักขระเมื่อฉันได้รับสายเดียวกันผ่านการร้องขอ ajax และจัดการเป็น "JSON" ไม่มีปัญหาเกิดขึ้น
Zer0

โปรดโพสต์สตริง JSON แบบเฉียบพลันของคุณ
Kshitij

{"data": [{id ": - คุณไม่มีเครื่องหมายอัญประกาศคู่ตรงนี้นั่นคือเริ่มต้นอัญประกาศคู่ของ id
Kshitij

2
เมื่อฉันได้รับผ่าน Ajax มันทำงานได้แล้วมันจัดการการตอบสนองเป็น JSON ดังนั้นฉันคิดว่าฉันต้องแปลงสิ่งนี้เป็นวัตถุ JSON ..
Zer0

2
ฉันลงเอยด้วยการไปที่ jsonlint.com และทำให้แน่ใจว่า Json ของฉันถูกต้อง
Zer0

26

คุณสามารถใช้JSON.parse()สำหรับการที่

ดูเอกสารที่ MDN

ตัวอย่าง:

var myObj = JSON.parse('{"p": 5}');
console.log(myObj);

1
สิ่งนี้ไม่ทำงาน กำลังส่งข้อผิดพลาด "SyntaxError: JSON.parse: อักขระที่ไม่คาดคิด" ไม่มีอะไรผิดปกติกับสายอักขระเมื่อฉันได้รับสายเดียวกันผ่านการร้องขอ ajax และจัดการเป็น "JSON" ไม่มีปัญหาเกิดขึ้น
Zer0

2
@ Zer0: คุณควรอัปเดตคำถามของคุณด้วยวิธีที่คุณลองกับสตริง json ของคุณ
Sarfraz

4
@ Zer0: เราสามารถตอบความรู้ที่ดีที่สุดของเราเท่านั้น คุณบอกว่าคุณมีสตริง JSON เราตอบตามนั้น ดูเหมือนว่าสตริงของคุณจะแตกต่างกันหากคุณโพสต์ไว้เราสามารถตอบคำถามนี้ได้ หากคุณถามคำถามเกี่ยวกับการเขียนโปรแกรมรหัส / ข้อมูลนั้นขาดไม่ได้
เฟลิกซ์คลิง

7

ฉันมีปัญหาเดียวกันกับสตริงที่คล้ายกันเช่นคุณ

{id:1,field1:"someField"},{id:2,field1:"someOtherField"}

ปัญหานี่คือโครงสร้างของสตริง ตัวแยกวิเคราะห์ json ไม่ได้ตระหนักว่าจำเป็นต้องสร้างวัตถุ 2 รายการในกรณีนี้ ดังนั้นสิ่งที่ฉันทำคือความงี่เง่าฉันเพิ่งจัดโครงสร้างสตริงของฉันใหม่และเพิ่มสิ่ง[]นี้ด้วยโปรแกรม parser ที่ได้รับการยอมรับ

var myString = {id:1,field1:"someField"},{id:2,field1:"someOtherField"}
myString = '[' + myString +']'
var json = $.parseJSON(myString)

หวังว่าจะช่วย

หากใครมีวิธีที่สง่างามกว่านี้กรุณาแบ่งปัน


ในรหัสของคุณด้านบนคุณสร้างmyStringไม่ถูกต้อง ไม่ใช่สตริงและมีการจัดรูปแบบ JSON อย่างไม่ถูกต้อง บรรทัดที่สองของคุณจะกลายเป็นรายการซ้ำซ้อน นี่คือสิ่งที่ควรจะเป็น: var myString = '[{"id":1,"field1":"someField"},{"id":2,"field1":"someOtherField"}]' ฉันรู้ว่านี่เป็นโพสต์เก่า แต่ฉันคิดว่าฉันจะเพิ่มความชัดเจนในกรณีที่มีใครพบมัน
James Eberhardt

ฉันแก้ไขปัญหาของฉันโดยใช้$.parseJSONที่JSON.parseไม่ทำงานและส่งข้อผิดพลาดJSON.parse is not a function
brasofilo


3

แปลงสตริงเป็น HashMap โดยใช้ Object Mapper ...

new ObjectMapper().readValue(string, Map.class);

แผนที่ภายในจะทำหน้าที่เป็นวัตถุ JSON


2
var Data=[{"id": "name2", "label": "Quantity"}]

ส่งตัวแปรสตริงไปยังการแยกวิเคราะห์ Json:

Objdata= Json.parse(Data);

ในตัวอย่างของคุณDataมีวัตถุอยู่แล้วดังนั้นจึงไม่จำเป็นต้องแยกวิเคราะห์ คุณจะต้องมีเครื่องหมายอัญประกาศล้อมรอบข้อมูลทั้งหมดของคุณเพื่อให้เป็นสตริง
James Eberhardt

2

เพียงใช้evalฟังก์ชั่น

var myJson = eval(theJsibStr);

eval เป็นสิ่งที่ชั่วร้ายโปรดระมัดระวังความปลอดภัยด้วยวิธีการนี้
dparker


0

ให้เราพิจารณาว่าคุณมีสายอักขระเหมือนกัน

ตัวอย่าง: "ชื่อ: lucy, อายุ: 21, เพศ: หญิง"

function getJsonData(query){
    let arrayOfKeyValues = query.split(',');
    let modifiedArray =  new Array();
    console.log(arrayOfKeyValues);
    for(let i=0;i< arrayOfKeyValues.length;i++){
        let arrayValues = arrayOfKeyValues[i].split(':');
        let arrayString ='"'+arrayValues[0]+'"'+':'+'"'+arrayValues[1]+'"';
        modifiedArray.push(arrayString);
    }
    let jsonDataString = '{'+modifiedArray.toString()+'}';
    let jsonData = JSON.parse(jsonDataString);
    console.log(jsonData);
    console.log(typeof jsonData);
    return jsonData;
}

let query = "name:lucy,age:21,gender:female";
let response = getJsonData(query);
console.log(response);

`

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.