2014-05-08 50 views
6

Tôi có đoạn mã sau đây, tôi không có bất kỳ kiểm soát nào đối với đầu ra này.Cách phân tích cú pháp JSON bằng số làm khóa

{ 
"questions": { 
    "9733": { 
     "text": "Star Trek or Star Wars?", 
     "answers": { 
      "41003": "Star Trek", 
      "41004": "Star Wars", 
      "41005": "Neither is superior in my opinion; both great in their own ways", 
      "41006": "Not a fan", 
      "41007": "I don't have an opinion on this" 
     } 
    }, 
    "25272": { 
     "text": "Which of these summer movies are you looking forward to the most?", 
     "answers": { 
      "99545": "World War Z", 
      "99546": "Monsters University ", 
      "99547": "White House Down", 
      "99548": "Man of Steel", 
      "99549": "Lone Ranger", 
      "99550": "The Wolverine" 
     } 
    }, 
    "27547": { 
     "text": "Should the U.S. attack Syria?", 
     "answers": { 
      "107453": "Yes", 
      "107454": "No" 
     } 
    } 
} 
} 

Tôi đang sử dụng json.parse để phân tích cú pháp này. Để có được văn bản của câu hỏi đầu tiên tôi thường làm một cái gì đó như thế này.

var jsonData = JSON.parse(data);//Where data = the json above 
console.log(jsonData.questions.9733.text);//Obviously this fails 

Tuy nhiên, javascript không thích số đó rõ ràng. Bạn khuyên bạn nên truy cập vào văn bản của câu hỏi đầu tiên như thế nào? Tôi muốn các json được thiết lập tốt hơn với trong một loạt các câu hỏi để thay thế. Thật không may tôi không có bất kỳ kiểm soát đầu ra của JSON này.

Tôi cũng sẽ không nhận thức được những gì các phím là khi họ đi qua, nhưng đó là một vấn đề khác. Tôi sẵn sàng giải trí mọi đề xuất về cách phân tích cú pháp điều này vì tôi chưa bao giờ phải phân tích cú pháp đầu ra JSON lạ như vậy.

+0

tôi sẽ chỉ sử dụng 'jsonData [ 'câu hỏi'] [ '9733'] [ 'text']' – NullUserException

+0

'jsonData.questions [9733] .text' nên làm việc. 'foo.bar' và' foo ['bar'] 'tương đương trong JS. – IMSoP

Trả lời

8

Bạn cần phải sử dụng bracket notation:

console.log(jsonData.questions["9733"].text); 

Nhưng vì giá trị bên trong dấu ngoặc sẽ được tự động chuyển đổi một chuỗi, điều này cũng sẽ làm việc:

console.log(jsonData.questions[9733].text); 

Lưu ý tuy nhiên, sử dụng phi chuỗi là tên thuộc tính thường có dạng xấu và có thể dẫn đến một số vấn đề tinh tế, ví dụ: nếu tên thuộc tính là "001" thì [001] sẽ không hoạt động.

+0

Tên thuộc tính được đúc thành chuỗi, vì vậy ví dụ cuối cùng của bạn sẽ không hoạt động chỉ vì '001' được chuyển thành' "1" 'thay vì' "001" ' – NullUserException

+0

@NullUserException Không, thực ra nó không (ít nhất, không có trong Opera/Chrome). Tôi nhận được "không xác định" khi cố gắng ví dụ cuối cùng dưới dạng một số, nhưng dữ liệu thực tế khi tôi chuyển đổi nó thành một chuỗi. – Cypher

+0

@Cypher Đọc lại nhận xét của tôi. – NullUserException

1

Nếu bạn phải sử dụng số như phím ... bạn có thể truy cập chúng như thế này:

var text = jsonData.questions["9733"].text; 

Chỉnh sửa: Bạn cũng có thể truy cập vào nó với số 9733. Nó không phải là một chuỗi . Chỉ cần là một chuỗi nếu khóa không phải là số.

2

Tôi tin rằng bạn có thể truy cập dữ liệu thông qua cùng một cú pháp như trong một mảng:

console.log(jsonData.questions[9733].text); 
+1

@NullUserException, nhưng nó vẫn hoạt động – sabof

+1

@sabof Tôi không nói đó là một mảng, nhưng cú pháp đó giống nhau. – Tohveli

+1

@NullUserException Cấp, có những lúc điều này sẽ không thành công (xem câu trả lời của p.s.w.g), nhưng trong trường hợp cụ thể này nó hoạt động. Tôi không thấy làm thế nào mà làm cho câu trả lời này "sai". – Cypher

0

Hãy thử sử dụng Ason, Nếu bạn đang sử dụng Java 8. Gradle phụ thuộc biên dịch 'org.arivu: ason: 1.0.3.

mã Java như sau

Ason ason = new Ason(); 
Object json = ason.fromJson("<<JSON String!>>"); 
System.out.println(Ason.getJson(json, "questions.9733.text", null)): 
+0

Chỉ cần bạn biết bạn cần phải xem xét các thẻ trong câu hỏi để đảm bảo bạn hiểu ngôn ngữ nào đang được sử dụng. Trong trường hợp này, thẻ là javascript và không phải java. – Caimen

Các vấn đề liên quan