2015-10-10 14 views
5

Đây là câu hỏi đầu tiên của tôi về SO ... vì vậy đừng đánh giá đúng =)Dữ liệu F #: Trình phân tích cú pháp JSON. Sử dụng JsonExtensions

Thông thường tất cả các câu hỏi của tôi đều được công bố trong số chat rooms (tin tôi, rất nhiều người trong số họ =)).

Gần đây, chúng tôi đang nói về số RosettaCode. Và tôi tự hỏi để bổ sung một số mã nhiệm vụ cho F #

Một trong số đó là JSON.

Một trong các giải pháp có thể là sử dụng "Dữ liệu F #: Trình phân tích cú pháp JSON". Vì vậy, câu hỏi của tôi được liên kết với nó.

Mã này hoạt động tốt:

open FSharp.Data 
open FSharp.Data.JsonExtensions 

type Person = {ID: int; Name:string} 

let json = """[ { "ID": 1, "Name": "First" }, { "ID": 2, "Name": "Second" }]""" 
json |> printfn "%s" 

match JsonValue.Parse(json) with 
| JsonValue.Array(x) -> 
    x |> Array.map(fun x -> {ID = System.Int32.Parse((x?ID).ToString()); Name = (string x?Name)}) 
| _ -> failwith "fail json" 
|> Array.iter(fun x -> printfn "%i %s" x.ID x.Name) 

In:

[ { "ID": 1, "Name": "First" }, { "ID": 2, "Name": "Second" }] 
1 "First" 
2 "Second" 

Nhưng nó

{ID = System.Int32.Parse((x?ID).ToString()); Name = (string x?Name)} 

không nhìn tốt.

This Tôi đọc về JsonExtensions,

nhưng khi tôi sử dụng

{ID = (x?ID.AsInteger()) ; Name = (x?Name.AsString()) } 

tôi nhận được biên dịch lỗi:

  • Các lĩnh vực, xây dựng hoặc "AsInteger" không được định nghĩa

  • Trường, hàm tạo hoặc "AsString" là n ot định nghĩa

Kỳ lạ thay, điều là tôi thấy khả năng tiếp cận thông qua "FSharp.Data.JsonExtensions mở"

enter image description here

Vì vậy, câu hỏi: Làm thế nào để sử dụng JsonExtensions?

Trả lời

3

Tôi đã cố gắng tái tạo điều này bằng một ví dụ tối thiểu, nhưng tôi không gặp lỗi - bạn có thể thử mẫu tối thiểu sau không?

#r "...../FSharp.Data.dll" 
open FSharp.Data.JsonExtensions 
open FSharp.Data 

JsonValue.Parse("A").AsArray() 
|> Array.map (fun a -> a?ID.AsInteger()) 

Tôi không nhận được tính năng tự động hoàn thành trên a?ID. (đó là một hạn chế của trình biên tập), nhưng nó biên dịch tốt.

Lý do duy nhất khiến tôi nghĩ rằng điều này có thể không hoạt động là nếu bạn có một tuyên bố open khác sẽ nhập một triển khai khác của toán tử ? không trả lại JsonValue.

API JsonValue chắc chắn không tốt bằng cách sử dụng nhà cung cấp loại - vì vậy nếu bạn có thể, tôi có thể đến nhà cung cấp loại thay thế (API cấp thấp là tốt nếu bạn cần lặp lại mọi thứ trong JSON đệ quy).

+0

Có, lỗi giống nhau –

+0

http://i.stack.imgur.com/l9Rz5.png –

+0

Điều này rất khó hiểu. Bạn đang sử dụng phiên bản F # + VS nào? –

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