Answered F# Try to parse nested JSON objects

  • Thursday, July 12, 2012 2:29 PM
     
      Has Code

    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 PM
    Moderator
     
     Answered Has Code

    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" user

    EDIT:

    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]



  • Thursday, July 12, 2012 6:57 PM
     
     

    Hello,

    Thank you very much, your code works.

    And it is similar to C#!