2012-10-21 13 views
5

से प्रतिक्रिया पर जेसन-रीड-टू-स्ट्रिंग, मैं json.el और furl.el का उपयोग कर रहा हूं ताकि toggl.com के एपीआई से समय प्रविष्टियां प्राप्त हो सकें - दुर्भाग्य से मुझे नहीं लगता कि यह प्रतिक्रिया को अलग कर रहा है एकाधिक सूचियों:एलीज़

JSON प्रतिक्रिया (डेटा में दो प्रविष्टियों):

{"data":[{"id":50439783,"description":"bar","billable":false,"start":"2012-10-20T18:07:00Z","stop":"2012-10-20T22:39:00Z","duration":16320,"workspace":{"id":172049,"name":"Dan's workspace"},"tag_names":[],"ignore_start_and_stop":false,"updated_at":"2012-10-20T22:40:26Z","user_id":231062},{"id":50440682,"description":"Test Time Entry","billable":false,"start":"2012-10-20T23:40:16Z","stop":"2012-10-20T23:50:16Z","duration":600,"workspace":{"id":172049,"name":"Dan's workspace"},"tag_names":[],"ignore_start_and_stop":false,"updated_at":"2012-10-20T23:51:32Z","user_id":231062}],"related_data_updated_at":"2012-10-19T00:00:00Z"} 

json-पढ़-से-स्ट्रिंग प्रतिक्रिया:

(related_data_updated_at . 2012-10-19T00:00:00Z)                               
(data . [((user_id . 231062) (updated_at . 2012-10-20T22:40:26Z) (ignore_start_and_stop . :json-false) (tag_names . []) (workspace ... ...) (duration . 16320) (stop . 20\ 
12-10-20T22:39:00Z) (start . 2012-10-20T18:07:00Z) (billable . :json-false) (description . bar) (id . 50439783)) ((user_id . 231062) (updated_at . 2012-10-20T23:51:32Z) \ 
(ignore_start_and_stop . :json-false) (tag_names . []) (workspace ... ...) (duration . 600) (stop . 2012-10-20T23:50:16Z) (start . 2012-10-20T23:40:16Z) (billable . :jso\ 
n-false) (description . Test Time Entry) (id . 50440682))]) 

तो अगर उस सूची में माना जाता है कई प्रविष्टियाँ, कैसे कर सकते थे मैं पहले पहुंचता हूँ? कार संबंधित_data_updated_at, और कुंजी डेटा प्रदर्शित करता है। सीडीआर संबंधित_data_updated_at का मूल्य दिखाता है, और बाकी सब कुछ।

मुझे नहीं लगता कि elisp बहुत मदद मिलेगी, लेकिन यहाँ यह सिर्फ बैठाना है:

(defun toggl-display-time-entries(json-string)                                
    (with-current-buffer (get-buffer-create "Toggl")                               
    (erase-buffer)                                       
    (let ((inhibit-read-only t)                                   
      (time-entries (json-read-from-string json-string)))                            
     (dolist (time-entry time-entries)                                 
     (newline)                                       
     (insert (format "%s" (cdr time-entry))))))) 

उत्तर

4

आप निकट पहुंच गए हैं, लेकिन आप 'डेटा निकालने के लिए और फिर सरणी पर पुनरावृति, न कि एक की जरूरत है सूची। उदाहरण के लिए यह सरणी में प्रत्येक आइटम से उपयोगकर्ता आईडी मुद्रित करता है:

(let ((array-of-times 
     (cdr 
    (assoc 'data 
      (json-read-from-string json-string))))) 
    (let ((c (length array-of-times))) 
    (dotimes (n c) 
     (insert (format "user_id %s\n" (cdr (assoc 'user_id (elt array-of-times n))))))))