Tôi đã tìm thấy nhiều thứ về việc chuyển đổi Groovy thành JSON, nhưng đủ kỳ quặc, không phải theo cách khác.JSON tới trình phân tích cú pháp Groovy
Trình phân tích JSON đến Groovy (tốt nhất) xung quanh ở đó là gì?
Tôi đã tìm thấy nhiều thứ về việc chuyển đổi Groovy thành JSON, nhưng đủ kỳ quặc, không phải theo cách khác.JSON tới trình phân tích cú pháp Groovy
Trình phân tích JSON đến Groovy (tốt nhất) xung quanh ở đó là gì?
Vì các lớp Groovy được biên dịch tương thích với các lớp Java, bạn sẽ có thể sử dụng bất kỳ thư viện Java nào để chuyển đổi JSON thành POJO (hoặc POGO). Jackson là một sự lựa chọn khá phổ biến mà bạn có thể sử dụng để chuyển đổi JSON như thế này:
String json = '{
"name" : { "first" : "Joe", "last" : "Sixpack" },
"gender" : "MALE",
"verified" : false,
"userImage" : "Rm9vYmFyIQ=="
}'
đến một bản đồ sử dụng:
Map<String,Object> userData = mapper.readValue(json, Map.class)
Hoặc nếu bạn muốn chuyển đổi JSON để một lớp người dùng Groovy:
User userData = mapper.readValue(json, User.class)
Điều này sẽ ánh xạ các thuộc tính trong lớp Groovy đến các khóa trong JSON.
JSON-lib tuyên bố có thể chuyển đổi POGO thành JSON và ngược lại. Nếu POGO có nghĩa là những gì tôi nghĩ nó (Plain Old Groovy Object), bạn đã thiết lập :).
Họ cho ví dụ này:
def strAsJsonObject = "{integer:1, bool: true}" as JSONObject
Cập nhật:
Tôi đã thử các lib bản thân mình, đây là mã hoàn chỉnh:
import net.sf.*;
import net.sf.json.*;
import net.sf.json.groovy.*;
println "hi"
GJson.enhanceClasses()
def strAsJsonObject = "{integer:1, bool: true}" as JSONObject
println strAsJsonObject
Nó sẽ đuổi theo bạn thông qua một marathon tải xuống các phụ thuộc (ezmorph, commons lang, commons commger) và một khi bạn đã giải quyết tất cả, đây là những gì bạn nhận được:
Exception in thread "main" org.codehaus.groovy.runtime.typehandling.GroovyCastException: Không thể đúc tượng '{số nguyên: 1, bool: đúng}' với lớp 'java.lang.String' đến lớp 'net.sf.json.JSONObject'
Theo The mailing list, bạn có được điều này vì đã không gọi GJsonlib.enhanceClasses(), nhưng tôi đã gọi đó là, như bạn thấy ở trên.
Tôi đã kết luận rằng đó là một nỗ lực đáng giá để ghét JSON-lib của Groovy.
tôi sử dụng JSON-lib trong HTTPBuilder, nhưng tôi sử dụng lớp JSONSlurper để phân tích một chuỗi để một trường hợp JSON:
JSON jsonMapObject = new JsonSlurper().parse("{integer:1, bool: true}");
Để đi từ Object để JSON, tôi làm điều này:
//from a map:
new JSONObject().putAll([one:'1', two:'two']).toString()
//from an object:
JSONObject.fromObject(somePOGO).toString()
Tại thời điểm này, bạn cần sử dụng "new JsonSlurper(). ParseText" thay vì sử dụng "new JsonSlurper(). Parse" – sourcerebels
Để những người gặp rắc rối với json-lib và GJson.enhanceClasses(). Hãy thử GJson.enhanceString() để thay thế.
GJson.enhanceString()
def o = "{\"x\": 20.0}" as JSONObject
GJson.enhanceString() giúp – squiddle
Nếu bạn đang sử dụng Groovy 1.8 hoặc mới hơn, có một bản dựng trong JsonSlurper bạn có thể sử dụng theo cách này:
import groovy.json.JsonSlurper
//Attention: you have to use double quotes inside the json string
def jsonObj = new JsonSlurper().parseText('{ "name":"Peter", "age": 23}')
assert jsonObj.name == "Peter"
assert jsonObj.age == 23
//this won't work, because it's not defined
assert jsonObj.gender == null
JSONSlurper thực sự gây ra ngoại lệ StackOverflow trên một số tài liệu JSON do việc sử dụng tự do regexps và cẩn thận trong triển khai thực hiện regexp Java. Xem http://jira.codehaus.org/browse/GROOVY-4903 (được đánh dấu là cố định nhưng vấn đề vẫn còn hiện diện) –
JsonSlurper cũng không deserialize ngày từ JSON, mà thực sự gây phiền nhiễu. – erturne
@erturne có thể có liên quan đến Ngày không phải là một phần của tiêu chuẩn JSON. Nếu JSON bạn đang nhận có 'new Date()' hoặc cú pháp không đứng khác, bạn sẽ cần phải phân lớp JsonSlurper, nếu không bạn chỉ có thể lặp lại và sửa bản đồ trả về. – Tobia
Điều đó tạo ra lỗi truyền. Tôi hiểu rằng cú pháp 'obj as JSONObject' thực sự chuyển đổi đối tượng Groovy thành JSON. – Gzorg
Sau đó tôi thấy nó trên tài liệu, vì vậy điều này sẽ làm việc như dự định, nhưng nó không làm việc cho tôi. – Gzorg
Bạn đã chạy GJson.enhanceClasses() chưa? – nes1983