‘Paste JSON As Classes’ in ASP.NET and Web Tools 2012.2 RC

Anand Paranjape(MSFT)

‘Paste JSON As Classes’ is a cool feature in ASP.NET and Web Tools 2012.2 RC. This feature will help you generate strongly typed classes in C# or VB.NET from valid JSON text.

With ASP.NET and Web Tools 2012.2 RC installed, you will see new menu option like below for C# and VB.NET Website and Web Application projects only. This new menu option will be enabled for .cs and .vb file extensions inside these projects:

clip_image001

 

JSON to C#/VB.NET class conversion

To use this feature, just copy sample JSON text and “Paste JSON As Classes” inside .vb or .cs file. This feature uses Newtonsoft JSON parser to parse JSON text from clipboard. Once Newtonsoft JSON parser validates the clipboard data as valid JSON, then it will be converted into C# or VB.NET class depending on the selected file type.

JSON to Classes Conversion rules

  1. Outermost class name is always Rootobject.
  2. All classes and properties are public.
  3. If property is a keyword in C#/VB.NET then it will be prepended with _ (underscore).
  4. If property is number then it will be converted to int/float/double/Single type
  5. JSON string is converted to string in C# and String in VB.NET
  6. Boolean data types are converted to bool in C# and Boolean in VB.NET
  7. If JSON text in clipboard is array of multiple JSON objects and for given property if value is null in one object and value is supported type in another then it will be marked as nullable type.
  8. With single JSON object, nullable data type will not be emitted.

Let’s look at some examples:

{
    "link": "http://www.microsoft.com/Surface/en-US", /*Awesome*/
    "virtual": "Virtual Keyboard",
    "partial": " The magnesium panels are finished with partial vapor deposition",
    "Price": 499.99,
    "title": "Microsoft Surface",
    "शीर्षक": "माइक्रोसॉफ्ट सरफेस",
    "Like": true,
    "cdDrive":null,
}

C# class for above JSON object will look like below.

public class Rootobject
{
    public string link { get; set; }
    public string _virtual { get; set; }
    public string partial { get; set; }
    public float Price { get; set; }
    public string title { get; set; }
    public string शीर्षक { get; set; }
    public bool Like { get; set; }
    public object cdDrive { get; set; }
}

VB.NET class will be like below

Public Class Rootobject
    Public link As String
    Public virtual As String
    Public _partial As String
    Public Price As Single
    Public title As String
    Public शीर्षक As String
    Public _Like As Boolean
    Public cdDrive As Object
End Class

DateTime Formats

JSON parser recognizes some DateTime formats as valid DateTime data types and some are not.

Below JSON object has some valid DateTime data and some invalid DateTime data types

[
 {
    "DateTimeValid": "2012-05-03T00:06:00.638Z",
    "NullableDateTime": null,
    "DateTimeToString": "2009-07-31T00:00Z",
    "DateTimeToObject": "2012-05-03T00:06:00.638Z",
 },
 {
    "DateTimeValid": "2012-05-03T00:06:00Z",
    "NullableDateTime": "2012-05-03T00:06:00.638Z",
    "DateTimeToString": "2009-07-31T00:00Z",
    "DateTimeToObject": "2012-05-03T00:06",
 }
]

C# class for above JSON object will look like below.

public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public DateTime DateTimeValid { get; set; }
    public DateTime? NullableDateTime { get; set; }
    public string DateTimeToString { get; set; }
    public object DateTimeToObject { get; set; }
}

First two properties of Class1 are valid DateTime objects, 3rd property is deemed as string as the DateTime format is not valid/recognized. Last property is converted as object as one object in array is valid DateTime and other object in array is invalid DateTime object. So property type cannot be DateTime nor can be string. Common base type for string and DateTime is object.

Single Dimensional Arrays

JSON Arrays are represented with [ ] notation in C# and with () in VB. Example as below.

[
 {
    "Name": "Kamal, Employee",
    "Manager": 
        {
            "Name": "Barry, Manager"
        }
 },
 {
    "Name": "Barry, Manager"
 }
]

C# class for above JSON object will look like below.

public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public string Name { get; set; }
    public Manager Manager { get; set; }
}

public class Manager
{
    public string Name { get; set; }
}

VB. NET class as below

Public Class Rootobject
    Public Property1() As Class1
End Class

Public Class Class1
    Public Name As String
    Public Manager As Manager
End Class

Public Class Manager
    Public Name As String
End Class

 

Multi-Dimensional Arrays

You can convert multi-dimension JSON arrays to classes. JSON Example for two dimensional array:

[ [ 1, 2, 3 ] ]

C# class for above JSON object will look like below:

public class Rootobject
{
    public int[][] Property1 { get; set; }
}

VB.NET class:

Public Class Rootobject
    Public Property1()() As Integer
End Class

Also you can convert JSON with objects having arrays inside array as shown in the example below

{
    "results": 
    [{
        "address_Office": 
        [{
            "street_number": "One",
            "city_name": "Bellevue",
            "state_name": "Washington",
            "street_name": [ "Microsoft Way" ]
        }],
    }]
}

C# class for above JSON object will look like below:

public class Rootobject
{
    public Result[] results { get; set; }
}

public class Result
{
    public Address_Office[] address_Office { get; set; }
}

public class Address_Office
{
    public string street_number { get; set; }
    public string city_name { get; set; }
    public string state_name { get; set; }
    public string[] street_name { get; set; }
}

VB.NET class:

Public Class Rootobject
    Public results() As Result
End Class

Public Class Result
    Public address_Office() As Address_Office
End Class

Public Class Address_Office
    Public street_number As String
    Public city_name As String
    Public state_name As String
    Public street_name() As String
End Class

Troubleshooting

If JSON Object in clipboard is invalid, error message will be shown with the reason.

Example: Below JSON object contains max value for decimal data type. Newtonsoft JSON Parser does not recognize values above 1.7976931348623157E+308(which is max value for double data type).

{
    "DecimalMax": 1.79769313486232E+308,
}

This will result in error like below when “Paste JSON As Classes” is called.

clip_image002

Another example of invalid JSON object where “” are not valid character:

{"login":””;}

This will result in error like below when “Paste JSON As Classes” is called.

clip_image003

Thank you for your time reading this blog post. Looking forward to hear your feedback on this feature!

0 comments

Discussion is closed.

Feedback usabilla icon