2013-03-04 49 views
7

Tôi đang tạo một dịch vụ web CRUD khá đơn giản trong Haskell với Warp (và có thể là Scotty) và trạng thái axit.Phân tích cú pháp các đối tượng json một phần bằng aeson trong haskell

Trong trạng thái axit I lưu trữ Bản ghi người dùng trong Data.Map (theo ví dụ this). Tôi biết rằng những hồ sơ đó sẽ luôn hoàn thành khi sáng tạo, vì vậy tôi không cần phải hội đủ điều kiện với rất nhiều MightS. Tuy nhiên, khi cập nhật một Người dùng, máy khách có thể chọn gửi một đối tượng json một phần, chỉ với một số trường được điền.

Cách thành ngữ để đại diện cho điều này là gì? Nếu tôi có một khai báo dữ liệu, FullUser, không có MaybeS và một chính xác giống với MaybeS trước tất cả các khóa tùy chọn, PartialUser, và để aeson tự động lấy mã và giải mã cho sau này, cuối cùng viết chức năng cập nhật của riêng tôi về loại :: FullUser -> PartialUser -> FullUser?

Nó sẽ không có nhiều mã, nhưng nó cảm thấy hơi xấu xí và giống như nó vi phạm DRY một chút. Nó nên là một nhiệm vụ phổ biến trong một máy chủ web, vì vậy có lẽ nó đã được giải quyết một cách tổng quát (có thể với TH)?

Tôi nhận ra rằng tôi có thể lưu trữ chuỗi json và luôn kiểm tra các phím bị thiếu, làm cho nó hơi vụng về nhưng bằng chứng trong tương lai cho thay đổi lược đồ, nhưng tôi vẫn muốn biết làm thế nào tôi sẽ làm điều đó " đường.

EDIT: Hoặc có lẽ tôi chỉ nên sử dụng FullUser và sử dụng ống kính aeson để viết chức năng cập nhật đơn giản từ FullUser và chuỗi json?

Trả lời

7

Haskell thành ngữ đang thực hiện kiểm tra tĩnh càng nhiều càng tốt. Bạn nên luôn luôn tiếp cận vấn đề của bạn từ một quan điểm của việc liệu có thể thay thế kiểm tra động với những cái tĩnh. Đó là cơ bản những gì làm cho các tuyên bố sau đây về Haskell khá gần với thực tế: "Nếu nó biên dịch, nó hoạt động". Vì vậy, chắc chắn là "Không" để làm việc với JSON thuần túy.

Giải pháp của bạn với FullUserPartialUser là chính xác. Mặc dù tôi khuyên bạn nên thực hiện một cách tiếp cận đặt tên khác: UserUserJSON - theo cách này bạn sẽ có được một ý nghĩa khá mô tả và hợp lý.

Tuy nhiên, có một vấn đề nhỏ với Aeson: các phiên bản được tạo don't yet support parsing missing fields (vui lòng bỏ phiếu cho vấn đề này). Vì vậy, bạn sẽ phải xác định các cá thể thủ công.

+0

Cảm ơn bạn đã nhập! Vâng, việc đặt tên chỉ để làm cho câu hỏi rõ ràng hơn. Kể từ khi trường hợp được tạo ra sẽ không đủ trong trường hợp này, tôi nghĩ rằng tôi sẽ đi với một chức năng cập nhật mà có một FullUser và một chuỗi json và sử dụng ống kính aeson (và có lẽ là một ống kính cho FullUser) để cập nhật nó. – Gurgeh

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