2009-05-13 6 views
14

Tôi đã xem xét JSONPath và mặc dù có vẻ như đã được thực hiện khá tốt, tôi tự hỏi liệu có ai đã làm việc với nó và có thể nhận xét về khả năng sử dụng của nó hay có thể đề xuất các lựa chọn thay thế không? Điều gì sẽ là thực sự slick là nếu có một plugin cho JQuery đã làm một cái gì đó như thế này. Tôi đã tìm kiếm các plugin và đưa tay trắng lên. Dù sao, trước khi tôi dành thời gian để biết JSONPath (trong đó có một số khía cạnh tôi không quan tâm), hoặc trước khi tôi phát minh lại bánh xe, tôi nghĩ rằng tôi sẽ thấy nếu có ai có một góc ...JSONPath hoặc XPath khác như tiện ích cho JSON/Javascript; hoặc Jquery JSON

Để cung cấp cho ý tưởng của bạn là gì, hãy tưởng tượng đối tượng Javascript này:

var Characters=[ 
     { 
      id: "CuriousGeorge", 
      species:"Monkey", 
      mood: "curious", 
      appendage: [ 
       { 
        type: "hand", 
        side: "left", 
        holding: [ 
         { id: "Banana" } 
        ] 
       }, 
       { 
        type: "hand", 
        side: "right", 
        holding: [] 
       }, 
       { 
        type: "foot", 
        side: "left", 
        holding: [] 
       }, 
       { 
        type: "foot", 
        side: "right", 
        holding: [ 
         { id: "YellowHat" }, 
         { id: "Keys" } 
        ] 
       } 
      ] 
     }, 
     { 
      id: "ManInYellowHat", 
      species: "Human", 
      mood: "angry", 
      //...ok, you get it... 
     } 
    ] 

Chẳng phải nó sẽ tuyệt vời để có được một số đối tượng sâu hơn bằng thứ gì đó giống như bộ chọn Jquery?

var banana=SomeUtility("Characters holding #Banana").get(0); 
var leftHands=SomeUtility("Characters appendage[type=hand][side=left]").get(); 

(Điều này có thể đủ điều kiện cho thế giới corniest dụ mã, nhưng hey, con tôi chỉ biết đứng nhìn. Và tôi không thể sử dụng ví dụ thực tế vì NDA ...)

... Và, để làm cho nó thú vị hơn, nếu tôi tạo ra một thứ như vậy, liệu có ai sử dụng nó không?

+1

Thêm thẻ [json] có vẻ phù hợp. – Tomalak

+0

Chắc chắn! Đã thêm ... – jlarson

+0

Câu hỏi thú vị. Một tương đương XPath cho JSON sẽ là một điều tuyệt vời, mặc dù các triển khai mà tôi đã xem (JSONPath và dojox.json.query) dường như sử dụng cú pháp của riêng họ vì một lý do nào đó mà tôi không hiểu. – Tomalak

Trả lời

4

Chắc chắn sẽ là một tiện ích hữu ích.

Ý kiến ​​của tôi là cách tốt nhất để tiếp cận điều này sẽ ở mức tương tự nhất có thể với bộ chọn css, như bạn chỉ ra. Tôi muốn khuyên bạn nên tìm kiếm dưới mui xe tại triển khai thực hiện các bộ chọn của jquery.

tôi sẽ đề nghị một cái gì đó giống như

var banana = object.function(jsonObect, "holding #Banana"); 
var leftHands = object.function(jsonObject, "appendage[type=hand][side=left]"); 

thay vì ví dụ sử dụng của bạn.

Tôi không chắc chắn như thế nào sắp tới native json support sẽ ảnh hưởng này ...

+0

Có, việc truyền vào đối tượng sẽ có ý nghĩa. Tôi đã làm một số hack vào đêm qua và được khuyến khích bởi các khả năng .... nhiều hơn nữa! – jlarson

+0

Hãy kiểm tra câu trả lời của tôi, tôi đã tạo ra một mẫu thử nghiệm – jlarson

2

dojo.getObject Dojo có một cơ sở làm việc lỏng lẻo như thế này, nơi bạn có thể cung cấp một con đường như "abc" vào thuộc tính bạn muốn tìm nạp.

Check it out:

http://api.dojotoolkit.org/jsdoc/1.3/dojo.getObject

Tôi không nghĩ rằng nó hiểu mảng khá là tốt và tôi nghĩ rằng đó là thiếu một ngôn ngữ chọn đầy đủ tính năng như một trong những bạn đang đề xuất.

Đối với việc sử dụng, tôi đã mã hóa một ngôn ngữ chọn giống như ngôn ngữ bạn đang đề xuất, nhưng đối với một ứng dụng khách và việc định địa chỉ mảng rất độc quyền đối với cấu trúc đối tượng cụ thể của chúng.

Tôi sẽ chắc chắn hãy sử dụng hệ thống như thế này nếu bạn muốn thực hiện và thậm chí có thể đóng góp nếu tôi thấy khu vực tôi có thể trợ giúp.

+0

Tôi đã không tìm thấy cái này, thú vị. Tôi chắc chắn cảm thấy đau đằng sau "Hữu ích cho chuỗi api dài hơn, nơi bạn phải kiểm tra từng đối tượng trong chuỗi", như tôi đã nhiều lần phải viết rác như var a = (b? C? D? Bcd: null: null : vô giá trị); [mặc dù thường xấu hơn nhiều và bao gồm các điều kiện khác]. Tuy nhiên, điều này dường như không đủ mạnh ...OK, chắc chắn thêm trọng lượng để tạo một thư viện JQuery giống như Jquery cho Json/JavascriptObjects, mặc dù sẽ có sự khác biệt rõ ràng cần thiết, và tôi nghi ngờ hiệu suất sẽ tốt ... – jlarson

+0

Vui lòng xem câu trả lời của tôi, tôi đã tạo ra một mẫu thử nghiệm – jlarson

4

OK, tôi đã tạo ra một nguyên mẫu cho điều này, có sẵn ở đây: http://code.google.com/p/jfunk/

Nó đã được chứng minh rất hữu ích đối với tôi, vì vậy tôi có thể sẽ chậm cải thiện và cấu trúc lại nó thành một cái gì đó tốt đẹp. Nhưng nếu tôi nhận được phản hồi tốt, tôi có thể di chuyển nhanh hơn. Tôi cũng sẽ hoan nghênh sự giúp đỡ.

+0

tốt đẹp. Tôi chỉ liếc qua đoạn mã. chắc chắn có cốt lõi của ý tưởng ở đó - có thể là một số điều chỉnh có thể có để làm cho nó hiệu quả hơn, nhưng có vẻ như chỉ hoạt động tốt ngay bây giờ. Tôi sẽ xem xét nó sau một hoặc hai tuần khi tôi có thêm thời gian. – cofiem

+0

có, không có thời gian để suy nghĩ về hiệu quả - ngoài việc nhận ra rằng DOM có một số lợi thế thực sự ở đây. _but_ bất kỳ nhiệm vụ nào hữu ích cho có thể không được triển khai hiệu quả theo bất kỳ cách nào khác ... mặc dù điều đó sẽ tranh luận cho việc thiết kế lại dữ liệu ... oh well, tôi nghĩ điều này sẽ hữu ích – jlarson

+0

repo trống và không thay đổi kể từ đầu giai đoạn nguyên mẫu? – Qrilka

6

Kiểm tra JSON Select - Bộ chọn giống CSS cho JSON.

+0

liên kết trỏ đến một trang web sai. Có nên là jsonselect.com không? – user152468

+0

@ user152468 Nó không có sẵn tại jsonselect.org nữa. Tôi đã cập nhật liên kết để truy cập vào repo GitHub của nó. – orad

3

Hãy thử sử dụng JSPath - https://github.com/dfilatov/jspath.

JSPath là một ngôn ngữ dành riêng cho miền (DSL) cho phép bạn điều hướng và tìm dữ liệu trong các tài liệu JSON của mình. Sử dụng JSPath, bạn có thể chọn các mục của JSON để lấy dữ liệu mà chúng chứa.

JSPath cho JSON giống như XPath cho XML.

1

Tôi vừa viết một JS-lib khách hàng thực hiện điều này - nó làm cho nó có thể truy vấn một cấu trúc JSON với XPath.

@jlarson - với "defiant.js", bạn có thể truy vấn cấu trúc JSON của bạn như thế này (lib này mở rộng đối tượng JSON toàn cầu):

JSON.search(Characters, '//*[id="Banana"]'); 



Cuộc gọi này sẽ trả về một mảng với các nút khớp và các đối sánh đó sẽ không được tách ra khỏi đối tượng JSON ban đầu của bạn (cùng một hành vi như khi làm việc với XML + XPath). Để minh họa cho những gì tôi muốn nói, đây là một chút giả (-ish) mã:

var store = { 
    "book": [ 
     { 
      "id": 1, 
      "price": 8.95, 
      "title": "Sayings of the Century", 
      "category": "reference", 
      "author": "Nigel Rees" 
     }, 
     { 
      "id": 2, 
      "price": 22.99, 
      "title": "The Lord of the Rings", 
      "category": "fiction", 
      "author": "J. R. R. Tolkien", 
      "isbn": "0-395-19395-8" 
     } 
    ] 
}; 

var b1 = JSON.search(store, '//book[1]'); 
b1[0].isbn = '12345'; 

console.log(store.book[0].isbn); 
// 12345 

lib này là vậy, đến nay cho trình duyệt và clientside nhưng tôi đã có kế hoạch tái viết nó cho NodeJS cuối cùng. Kiểm tra bộ đánh giá Xpath tại đây; thể hiện chức năng. Có cũng trước bằng văn bản biểu thức XPath cũng như:

http://defiantjs.com/#xpath_evaluator

Bạn có thể tìm lib tại Github:
https://github.com/hbi99/defiant.js

Cuối cùng, có một chút chức năng hơn trong "defiant.js" và nếu bạn quan tâm, bạn hy vọng sẽ đọc về nó ở đó (http://defiant.com)

Tôi hy vọng bạn sẽ thấy nó hữu ích.

1

Có vẻ như có một tùy chọn mới: jQuery-JSONPath. Dường như chính xác những gì bạn đang yêu cầu.