2012-06-16 23 views
7

Tôi viết một/app Groovy Grails và tôi có một đối tượng JSON với một tên "chuỗi" (grommetphụ tùng) bên trong params thành viên đó có thể thay đổi. Tức là, lần tới có thể là acmezoom. Đây là JSON:JSON để Groovy với JsonSlurper và không rõ "chuỗi"

def jx = """{ 
    "job": "42", 
    "params": { 
     "grommet": {"name": "x", "data": "y"}, 
     "widget": { "name": "a", "data": "b"} 
    } 
}""" 

Tôi cố gắng để tìm ra cách để có được những chuỗi grommet. Mã cho đến nay:

def dalist = new JsonSlurper().parseText(jx) 
println dalist.job  // Gives: 42 
println dalist.params // Gives: [grommet:[name:x, data:y], widget:[name:a, data:b]] 
println dalist.params[0] // Gives: null 

Bất kỳ ý tưởng làm thế nào để có được chuỗi grommet? Iama cứ đánh đầu vào tường.

+0

IRB (chính): 001: 0> rand (3) + 1 => 1 interwebs đã nói, trả lời 1 được chọn. cảm ơn tất cả. – rtfminc

Trả lời

9

Mấu chốt params trên đối tượng JSON được liên kết với một đối tượng JSON, không phải là một mảng, vì vậy bạn không thể truy cập nó bằng cách chỉ mục. JsonSlurper ánh xạ các đối tượng JSON tới Groovy Maps, vì vậy bạn có thể truy cập params bằng các khóa của nó, là các chuỗi, ví dụ: dalist.params.grommet, sẽ cung cấp cho bạn bản đồ [name: 'x', data: 'y'].

Để truy cập các phím trên số params bạn có thể làm dalist.params.keySet(), danh sách này sẽ cung cấp cho bạn danh sách ['grommet', 'widget']. Nếu bạn quan tâm đến việc chỉ biết các phím params, điều đó cần phải thực hiện thủ thuật. Nếu bạn cần nhận chuỗi 'grommet' vì lý do nào đó, bạn có thể thực hiện bằng cách truy cập phần tử đầu tiên trên danh sách đó, tức là dalist.params.keySet()[0], nhưng tôi không biết tại sao bạn muốn biết điều đó. Và tôi không chắc chắn nếu nó được đảm bảo rằng khóa đầu tiên của bản đồ đó sẽ luôn là 'grommet', vì các đối tượng JSON không được sắp xếp theo thông số kỹ thuật (từ json.org: Một đối tượng là một bộ tên/giá trị không theo thứ tự), nhưng lần lượt, bản đồ Groovy được đặt hàng (thực hiện mặc định là LinkedHashMap) ... vì vậy tôi sẽ giả định rằng thứ tự được bảo toàn khi phân tích cú pháp JSON sang thế giới Groovy, nhưng tôi cố gắng không dựa vào hành vi cụ thể đó hehe .

+0

Tôi nhìn vào api một lần nữa khi tôi nghĩ rằng nó trở về Object (doh!) Và không thấy rằng nó trở lại danh sách và bản đồ. Cảm ơn câu trả lời. – rtfminc

4

Map dụ, hãy thử:

def params = dalist.params.entrySet() as List // entrySet() returns Set, but it's easier to use it as a List 
println params 
println params.size() 
println params[0] 
println params[0].key 
println params[0].value 
+0

Cảm ơn! Điều này hoạt động như tôi muốn. – rtfminc

2

Điều này có thể giúp bạn.

import groovy.json.JsonSlurper; 
def jx='{"job":"42","params":{"grommet":{"name":"x","data":"y"},"widget":{"name":"a","data":"b"}}}' 

def dalist = new JsonSlurper().parseText(jx) 

assert dalist.params.getClass().name == "java.util.HashMap"; 
assert dalist.params.size() == 2; 

def keys = dalist.params.collect{ a, b -> a}; // returns "[grommet, widget]" 
assert !!dalist.params.get("grommet") == true 
+0

Cảm ơn, điều này làm những gì tôi nghĩ tôi có thể làm. Bây giờ tôi nên chọn séc để làm gì? Tất cả ba câu trả lời trên nhãn hiệu. – rtfminc

+1

@rtfminc Bạn có thể upvote cả ba và sau đó chọn ngẫu nhiên một. –

+0

upvote tất cả 3: nhiệm vụ hoàn thành. – rtfminc

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