2015-04-28 21 views
6

Tôi có một json lồng nhau có cấu trúc không được xác định. Nó có thể khác nhau mỗi khi tôi chạy vì tôi đang đọc từ một tập tin từ xa. Tôi cần phải chuyển đổi json này thành một bản đồ của loại Map[String, Any]. Tôi đã cố gắng để xem xét json4s và phân tích cú pháp jackson nhưng họ dường như không giải quyết vấn đề này tôi có. Có ai biết làm thế nào tôi có thể đạt được điều này?Làm thế nào tôi có thể chuyển đổi một chuỗi json thành một bản đồ scala?

Ví dụ chuỗi:

{"body":{ 
    "method":"string", 
    "events":"string", 
    "clients":"string", 
    "parameter":"string", 
    "channel":"string", 
    "metadata":{ 
     "meta1":"string", 
     "meta2":"string", 
     "meta3":"string" 
    } 
}, 
"timestamp":"string"} 

Mức độ làm tổ có thể tùy ý và không được xác định trước.
Để trợ giúp với trường hợp sử dụng:
Tôi có một Bản đồ [Chuỗi, Bất kỳ] mà tôi cần lưu trữ trong tệp dưới dạng bản sao lưu. Vì vậy, tôi chuyển đổi nó thành một chuỗi json và lưu trữ nó trong một tập tin. Bây giờ mỗi khi tôi nhận được dữ liệu mới, tôi cần lấy json từ tệp, chuyển đổi nó thành bản đồ một lần nữa và thực hiện một số tính toán. Tôi không thể lưu trữ bản đồ trong bộ nhớ vì tôi sẽ mất điều đó nếu công việc của tôi thất bại.
Tôi cần một giải pháp có thể chuyển đổi chuỗi json trở lại bản đồ ban đầu mà tôi đã có trước khi tôi chuyển đổi nó.

+0

tại sao bạn không sử dụng JSON.parseRaw? – turutosiya

+0

Bạn có thể đăng một ví dụ về JSON và bất kỳ mã hữu ích nào khác không? hoặc thông tin? –

+0

Làm cách nào để bạn có thể tuần tự hóa 'Bất kỳ'? –

Trả lời

6

Tôi đã thử các phương pháp sau đây với json4s 3.2.11 và nó hoạt động:

import org.json4s._ 
import org.json4s.jackson.JsonMethods._ 

//... 
def jsonStrToMap(jsonStr: String): Map[String, Any] = { 
    implicit val formats = org.json4s.DefaultFormats 

    parse(jsonStr).extract[Map[String, Any]] 
} 

Có lẽ bạn đã không xác định implicit val loại Formats? Cũng lưu ý rằng bạn không cần phải có một số implicit val trong mỗi phương thức và miễn là có thể tìm thấy trong phạm vi.

+0

Xin chào @lambdista, Mã có vẻ hoàn hảo. và tôi muốn thực hiện điều này như là một chức năng tùy chỉnh trong tia lửa nhưng khung dữ liệu tia lửa không hỗ trợ "bất kỳ" ref và tôi đã thử cùng với String, String nhưng nó không có vẻ là làm việc. Bạn có bất kỳ ý tưởng làm thế nào chúng ta có thể làm cho loại cụ thể? Cảm ơn – GSR

1

Bạn có thể sử dụng đoạn mã sau để phân tích một chuỗi JSON thành một Map[String, Any]

val jsonMap = parse(jsonString).values.asInstanceOf[Map[String, Any]] 

Tuy nhiên, đây là không an toàn kiểu và do đó nên được sử dụng một cách thận trọng khi giải nén các giá trị từ bản đồ.

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