F# Try to parse nested JSON objects
-
Thursday, July 12, 2012 2:29 PM
Hello,
I found a C# program to parse nested JSON object:
protected void Page_Load(object sender, EventArgs e) { string jSon = "{\"FirstName\":\"Foo\", " + "\"LastName\":\"Bar\"," + "\"Hobbies\":" + "[" + "{\"Sport\":\"FootBall\"},{\"Music\":\"Rock\"}" + "]}"; var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); User user = serializer.Deserialize<User>(jSon); } public class User { public string FirstName { get; set; } public string LastName { get; set; } public System.Collections.ObjectModel.Collection<Hobbie> Hobbies { get; set; } } public class Hobbie { public string Sport { get; set; } public string Music { get; set; } }
I want to do the same in F#
open System.Collections.ObjectModel
open System.Runtime.Serialization
open System.Runtime.Serialization.Json
open System.Text
[<DataContract>]
type people() =
let mutable firstName = ""
let mutable lastName = ""
[<DataMember>]
member p.FirstName with get() = firstName and set(v) = firstName <- v
[<DataMember>]
member p.LastName with get() = lastName and set(v) = lastName <- v
However, I don’t know how to declare nested structure in F#.
Any one has any idea?
Besides, how to parse it using JSON in F#?
Thanks,
All Replies
-
Thursday, July 12, 2012 2:44 PM
Usually you could define nested data structures using F# discriminated unions.
Take a look for example at this post: http://blog.efvincent.com/parsing-json-using-f
Petr
-
Thursday, July 12, 2012 6:10 PMModerator
You can do it exactly like C#. With F# 3.0:
let json = """ { "FirstName":"Foo", "LastName":"Bar", "Hobbies": [ {"Sport":"FootBall"},{"Music":"Rock"} ]} """ type Hobby() = member val Sport = "" with get, set member val Music = "" with get, set override this.ToString() = this.Sport + " " + this.Music type User() = member val FirstName = "" with get, set member val LastName = "" with get, set member val Hobbies : System.Collections.ObjectModel.Collection<Hobby> = null with get, set override this.ToString() = sprintf "%s, %s: %A" this.LastName this.FirstName (this.Hobbies |> Seq.toList) // reference System.Web.Extensions.dll let serializer = new System.Web.Script.Serialization.JavaScriptSerializer() let user = serializer.Deserialize<User>(json) printfn "%A" userEDIT:
Actually, using records with the new F# 3.0 CLIMutableAttribute is an even easier way to describe the structure:
[<CLIMutable>] type Hobby = { Sport:string; Music:string } [<CLIMutable>] type User = { FirstName:string; LastName:string; Hobbies : System.Collections.ObjectModel.Collection<Hobby> }
Brian McNamara [MSFT]
- Edited by Brian McNamara - MSFTModerator Thursday, July 12, 2012 6:10 PM
- Edited by Brian McNamara - MSFTModerator Thursday, July 12, 2012 6:52 PM
- Marked As Answer by zydjohn Thursday, July 12, 2012 6:55 PM
-
Thursday, July 12, 2012 6:57 PM
Hello,
Thank you very much, your code works.
And it is similar to C#!

