By Hui


2011-06-01 12:59:21 8 Comments

I have classes like these:

class MyDate
{
    int year, month, day;
}

class Lad
{
    string firstName;
    string lastName;
    MyDate dateOfBirth;
}

And I would like to turn a Lad object into a JSON string like this:

{
    "firstName":"Markoff",
    "lastName":"Chaney",
    "dateOfBirth":
    {
        "year":"1901",
        "month":"4",
        "day":"30"
    }
}

(without the formatting). I found this link, but it uses a namespace that's not in .NET 4. I also heard about JSON.NET, but their site seems to be down at the moment, and I'm not keen on using external DLL files. Are there other options besides manually creating a JSON string writer?

14 comments

@tdykstra 2019-10-08 21:26:32

A new JSON serializer is available in the System.Text.Json namespace. It's included in the .NET Core 3.0 shared framework and is in a NuGet package for projects that target .NET Standard or .NET Framework or .NET Core 2.x.

Example code:

using System;
using System.Text.Json;

public class MyDate
{
    public int year { get; set; }
    public int month { get; set; }
    public int day { get; set; }
}

public class Lad
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public MyDate DateOfBirth { get; set; }
}

class Program
{
    static void Main()
    {
        var lad = new Lad
        {
            FirstName = "Markoff",
            LastName = "Chaney",
            DateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };
        var json = JsonSerializer.Serialize(lad);
        Console.WriteLine(json);
    }
}

In this example the classes to be serialized have properties rather than fields; the System.Text.Json serializer currently doesn't serialize fields.

Documentation:

@Waleed Naveed 2019-08-02 08:16:43

You can achieve this by using Newtonsoft.json. Install Newtonsoft.json from Nuget. and then:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);

@Darin Dimitrov 2011-06-01 13:05:38

You could use the JavaScriptSerializer class (add reference to System.Web.Extensions):

using System.Web.Script.Serialization;
var json = new JavaScriptSerializer().Serialize(obj);

A full example:

using System;
using System.Web.Script.Serialization;

public class MyDate
{
    public int year;
    public int month;
    public int day;
}

public class Lad
{
    public string firstName;
    public string lastName;
    public MyDate dateOfBirth;
}

class Program
{
    static void Main()
    {
        var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };
        var json = new JavaScriptSerializer().Serialize(obj);
        Console.WriteLine(json);
    }
}

@rzelek 2016-02-01 15:12:31

Please have in mind that Microsoft suggests to use JSON.net instead of this solution. I think that this answer became inappropriate. Take a look at willsteel's answer. Source: https://msdn.microsoft.com/en-us/library/system.web.script.s‌​erialization.javascr‌​iptserializer.aspx.

@Mafii 2016-07-06 10:19:43

@DarinDimitrov you should consider adding a hint about JSON.net. Microsoft recommends it over JavascriptSerializer: msdn.microsoft.com/en-us/library/… You could also add a hint to msdn.microsoft.com/en-us/library/… which is the framework included approach

@stom 2017-01-25 08:24:58

here is online tool to convert your classes to json format, hope helps someone.

@Happy Bird 2017-02-13 15:31:24

using System.Web.Script.Serialization;

@Protector one 2017-03-17 09:53:22

Why would Microsoft recommend a 3rd party solution over their own? Their wording is very odd as well: "Json.NET should be used serialization and deserialization. Provides serialization and deserialization functionality for AJAX-enabled applications."

@Hossein Ganjyar 2018-04-16 08:32:32

but this solution not return number as string... please tell me a solution same of javascript stringify, that it convert any key:value to string. my problem is with number.

@whiskeyfur 2018-08-10 16:57:07

@rzlek Microsoft only recommended JSON.net for one specific version of the .net library (If you believe the butchered english that is). That recommendation did NOT carry over after that, and the link posted is no longer being maintained.

@Sisir 2018-10-15 09:18:32

Just a heads up, to reference to System.Web.Extensions, you must have ASP.NET AJAX 1.0 or ASP.NET 3.5 installed on your system. Please see this stackoverflow.com/questions/7723489/…

@Artem Polishchuk 2014-11-21 22:18:58

Use this tools for generate C# class, then use this code to serialize your object

 var json = new JavaScriptSerializer().Serialize(obj);

@user8426627 2018-01-28 16:00:31

If they are not very big, whats probably your case export it as Json. Also this makes portable among all plattforms

 using Newtonsoft.Json;
     [TestMethod]
        public void ExportJson()
        {
        double[,] b = new double[,] {
            { 110, 120, 130, 140, 150 },
            { 1110, 1120, 1130, 1140, 1150 },
            { 1000, 1, 5 ,9, 1000},
            {1110, 2, 6 ,10,1110},
            {1220, 3, 7 ,11,1220},
            {1330, 4, 8 ,12,1330} };


        string jsonStr = JsonConvert.SerializeObject(b);

        Console.WriteLine(jsonStr);

        string path = "X:\\Programming\\workspaceEclipse\\PyTutorials\\src\\tensorflow_tutorials\\export.txt";

        File.WriteAllText(path, jsonStr);
    }

@Gokulan P H 2017-06-21 08:15:20

Use Json.Net library, you can download it from Nuget Packet Manager.

Serializing to Json String:

 var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };

var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(obj);

Deserializing to Object:

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Lad>(jsonString );

@micahhoover 2016-09-16 15:53:46

If you are in an ASP.NET MVC web controller it's as simple as:

string ladAsJson = Json(Lad);

Can't believe no one has mentioned this.

@csga5000 2016-09-23 05:30:31

I get an error about not being able to cast jsonresult to string.

@ewomack 2016-11-07 19:55:20

It will compile with implicit typing: var ladAsJson = Json(Lad).

@Edgar 2011-06-01 13:03:02

Use the DataContractJsonSerializer class: MSDN1, MSDN2.

My example: HERE.

It can also safely deserialize objects from a JSON string, unlike JavaScriptSerializer. But personally I still prefer Json.NET.

@Cristi Diaconescu 2015-01-17 21:26:05

Still don't see any examples on that page, but here are some on MSDN and elsewhere -> the last one uses extension methods to achieve one-liners.

@Cristi Diaconescu 2015-01-19 08:48:54

Oh, I missed the 2nd MSDN link :)

@MiFreidgeim SO-stop being evil 2016-07-14 02:56:32

It doesn't serialize plain classes. The error reported "Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. If the type is a collection, consider marking it with the CollectionDataContractAttribute."

@Edgar 2016-07-15 06:25:32

@MichaelFreidgeim That's right, you have to mark properties in the class you want to serialize with attributes. DataContractAttribute DataMemberAttribute

@MiFreidgeim SO-stop being evil 2016-07-15 07:14:19

@Edgar: this is why JavaScriptSerializer better :)

@Edgar 2016-07-15 13:49:14

@MichaelFreidgeim Which is better depends on the requirements. The attributes let you configure how the property is serialized.

@amuliar 2017-11-13 11:58:49

DataContractJsonSerializer is very bad because it requires attributes to be set for any type (e.g. library objects).

@wchoward 2016-02-03 18:00:09

Serializer

 public static void WriteToJsonFile<T>(string filePath, T objectToWrite, bool append = false) where T : new()
{
        var contentsToWriteToFile = JsonConvert.SerializeObject(objectToWrite, new JsonSerializerSettings
        {
            Formatting = Formatting.Indented,
        });
        using (var writer = new StreamWriter(filePath, append))
        {
            writer.Write(contentsToWriteToFile);
        }
}

Object

namespace MyConfig
{
    public class AppConfigurationSettings
    {
        public AppConfigurationSettings()
        {
            /* initialize the object if you want to output a new document
             * for use as a template or default settings possibly when 
             * an app is started.
             */
            if (AppSettings == null) { AppSettings=new AppSettings();}
        }

        public AppSettings AppSettings { get; set; }
    }

    public class AppSettings
    {
        public bool DebugMode { get; set; } = false;
    }
}

Implementation

var jsonObject = new AppConfigurationSettings();
WriteToJsonFile<AppConfigurationSettings>(file.FullName, jsonObject);

Output

{
  "AppSettings": {
    "DebugMode": false
  }
}

@Jean J. Michel 2014-02-04 20:07:38

Wooou! Really better using a JSON framework :)

Here is my example using Json.NET (http://james.newtonking.com/json):

using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using System.IO;

namespace com.blogspot.jeanjmichel.jsontest.model
{
    public class Contact
    {
        private Int64 id;
        private String name;
        List<Address> addresses;

        public Int64 Id
        {
            set { this.id = value; }
            get { return this.id; }
        }

        public String Name
        {
            set { this.name = value; }
            get { return this.name; }
        }

        public List<Address> Addresses
        {
            set { this.addresses = value; }
            get { return this.addresses; }
        }

        public String ToJSONRepresentation()
        {
            StringBuilder sb = new StringBuilder();
            JsonWriter jw = new JsonTextWriter(new StringWriter(sb));

            jw.Formatting = Formatting.Indented;
            jw.WriteStartObject();
            jw.WritePropertyName("id");
            jw.WriteValue(this.Id);
            jw.WritePropertyName("name");
            jw.WriteValue(this.Name);

            jw.WritePropertyName("addresses");
            jw.WriteStartArray();

            int i;
            i = 0;

            for (i = 0; i < addresses.Count; i++)
            {
                jw.WriteStartObject();
                jw.WritePropertyName("id");
                jw.WriteValue(addresses[i].Id);
                jw.WritePropertyName("streetAddress");
                jw.WriteValue(addresses[i].StreetAddress);
                jw.WritePropertyName("complement");
                jw.WriteValue(addresses[i].Complement);
                jw.WritePropertyName("city");
                jw.WriteValue(addresses[i].City);
                jw.WritePropertyName("province");
                jw.WriteValue(addresses[i].Province);
                jw.WritePropertyName("country");
                jw.WriteValue(addresses[i].Country);
                jw.WritePropertyName("postalCode");
                jw.WriteValue(addresses[i].PostalCode);
                jw.WriteEndObject();
            }

            jw.WriteEndArray();

            jw.WriteEndObject();

            return sb.ToString();
        }

        public Contact()
        {
        }

        public Contact(Int64 id, String personName, List<Address> addresses)
        {
            this.id = id;
            this.name = personName;
            this.addresses = addresses;
        }

        public Contact(String JSONRepresentation)
        {
            //To do
        }
    }
}

The test:

using System;
using System.Collections.Generic;
using com.blogspot.jeanjmichel.jsontest.model;

namespace com.blogspot.jeanjmichel.jsontest.main
{
    public class Program
    {
        static void Main(string[] args)
        {
            List<Address> addresses = new List<Address>();
            addresses.Add(new Address(1, "Rua Dr. Fernandes Coelho, 85", "15º andar", "São Paulo", "São Paulo", "Brazil", "05423040"));
            addresses.Add(new Address(2, "Avenida Senador Teotônio Vilela, 241", null, "São Paulo", "São Paulo", "Brazil", null));

            Contact contact = new Contact(1, "Ayrton Senna", addresses);

            Console.WriteLine(contact.ToJSONRepresentation());
            Console.ReadKey();
        }
    }
}

The result:

{
  "id": 1,
  "name": "Ayrton Senna",
  "addresses": [
    {
      "id": 1,
      "streetAddress": "Rua Dr. Fernandes Coelho, 85",
      "complement": "15º andar",
      "city": "São Paulo",
      "province": "São Paulo",
      "country": "Brazil",
      "postalCode": "05423040"
    },
    {
      "id": 2,
      "streetAddress": "Avenida Senador Teotônio Vilela, 241",
      "complement": null,
      "city": "São Paulo",
      "province": "São Paulo",
      "country": "Brazil",
      "postalCode": null
    }
  ]
}

Now I will implement the constructor method that will receives a JSON string and populates the class' fields.

@MatthewD 2016-05-30 13:33:12

Good post, this is the most current way to do it.

@MarzSocks 2014-06-26 14:02:01

As easy as this, works for dynamic objects as well (type object):

string json = new
System.Web.Script.Serialization.JavaScriptSerializer().Serialize(MYOBJECT);

@Mahdi Rafatjah 2016-07-11 07:17:23

there is no default script under web. :(

@MarzSocks 2016-07-11 19:08:41

You are looking for this:msdn.microsoft.com/en-us/library/…

@Mahdi Rafatjah 2016-07-12 03:43:45

I kind of tried that but no. Script I guess I should add it as reference. So thanks a lot

@mschmoock 2013-10-02 12:39:47

Since we all love one liners

... this one depends on the Newtonsoft NuGet package, which is popular and better than the default serializer.

Newtonsoft.Json.JsonConvert.SerializeObject(new {foo = "bar"})

Documentation: Serializing and Deserializing JSON

@Andrei 2013-10-02 13:04:01

Newtonsoft serializer is way faster and mor customizable then built in. Highly recommend to use it. Thanks for the answer @willsteel

@Josef Pfleger 2015-06-01 08:53:50

It's worth pointing out that it's not really free. See /pricing on the website.

@David Cumps 2015-06-03 19:51:01

@JosefPfleger the pricing is for JSON.NET Schema, not JSON.NET the regular serializer, which is MIT

@nemke 2015-09-28 11:34:17

My testing showed that Newtonsoft is slower than JavaScriptSerializer class. (.NET 4.5.2)

@dsghi 2015-11-05 06:10:48

If you read the MSDN documentation for JavaScriptSerializer, it flat out says use JSON.net.

@cb88 2016-08-24 15:28:52

@JosefPfleger Newtionsoft JSON.net is MIT licensed... you could make modifications and resell it it you wanted. Their pricing page is about commercial technical support, and some schema validator they have.

@Stamos 2017-03-30 10:09:18

With JavaScriptSerializer DateTime property was serialized as "date": "/Date(1490648400000)/" and was causing deserialized date to be a day back .In Newtonsof was "date": "2017-03-29T00:00:00" and solved my problem.

@Barry Guvenkaya 2017-07-06 01:55:03

ExpandoObject could be the way to go if you guys want to create a dynamic object.

@Hithesh 2014-03-06 09:39:37

Use the below code for converting XML to JSON.

var json = new JavaScriptSerializer().Serialize(obj);

@James 2013-10-02 13:39:59

I would vote for ServiceStack's JSON Serializer:

using ServiceStack.Text

string jsonString = new { FirstName = "James" }.ToJson();

It is also the fastest JSON serializer available for .NET: http://www.servicestack.net/benchmarks/

@Michael Logutov 2013-10-25 09:22:44

Those are very old benchmarks there. I've just test all three current versions of Newtonsoft, ServiceStack and JavaScriptSerializer and currently Newtonsoft is the fastest. Tho they all do quite fast.

@joelnet 2013-12-19 00:25:51

ServiceStack doesn't appear to be free.

@James 2013-12-19 10:21:18

@joelnet this is now the case, but was free when answering the question. However it is free for small sites, and I am still using it even though it is paid, it is a superb framework.

@JohnLBevan 2018-12-13 09:39:36

Some benchmarks here, though there's non for the serialization on its own: docs.servicestack.net/real-world-performance

Related Questions

Sponsored Content

65 Answered Questions

[SOLVED] What is the difference between String and string in C#?

22 Answered Questions

[SOLVED] Convert JS object to JSON string

26 Answered Questions

[SOLVED] How can I pretty-print JSON using JavaScript?

23 Answered Questions

61 Answered Questions

[SOLVED] How do I calculate someone's age in C#?

  • 2008-07-31 23:40:59
  • Jeff Atwood
  • 577752 View
  • 1768 Score
  • 61 Answer
  • Tags:   c# .net datetime

24 Answered Questions

[SOLVED] Safely turning a JSON string into an object

  • 2008-09-05 00:12:01
  • Matt Sheppard
  • 1230639 View
  • 1306 Score
  • 24 Answer
  • Tags:   javascript json

54 Answered Questions

[SOLVED] How can I pretty-print JSON in a shell script?

39 Answered Questions

26 Answered Questions

[SOLVED] Deserialize JSON into C# dynamic object?

40 Answered Questions

[SOLVED] How do I format a Microsoft JSON date?

Sponsored Content