1286

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?

4
  • 4
    JSON.net can be loaded here An other and faster (as they say - I did not test it myself) solution is ServiceStack.Text I would not recommend rolling your own JSON parser. It will likely be slower and more error prone or you have to invest lots of time. Commented Jun 1, 2011 at 13:01
  • 1
    yes. C# has a type called JavaScriptSerializer Commented Jun 1, 2011 at 13:02
  • possible duplicate of Generics / JSON JavaScriptSerializer C# Commented Jun 1, 2011 at 13:03
  • 3
    Hm.. as far as I can see you should be able to use: msdn.microsoft.com/en-us/library/… Which is also in .Net 4.0 according to the MSDN page. You should be able to use the Serialize(Object obj) method: msdn.microsoft.com/en-us/library/bb292287.aspx Am I missing something here? Btw. you link seems to be a some code and not a link Commented Jun 1, 2011 at 13:04

15 Answers 15

1498

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

Sign up to request clarification or add additional context in comments.

10 Comments

Newtonsoft serializer is way faster and mor customizable then built in. Highly recommend to use it. Thanks for the answer @willsteel
@JosefPfleger the pricing is for JSON.NET Schema, not JSON.NET the regular serializer, which is MIT
If you read the MSDN documentation for JavaScriptSerializer, it flat out says use JSON.net.
@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.
For everyone reading this, do note that this answer is very very old. Although Newtonsoft.Json is still very popular, and does the job, do consider using the new (built in) System.Text.Json which is mentioned in other answers
|
1030

Please Note

Microsoft recommends that you DO NOT USE JavaScriptSerializer

See the header of the documentation page:

For .NET Framework 4.7.2 and later versions, use the APIs in the System.Text.Json namespace for serialization and deserialization. For earlier versions of .NET Framework, use Newtonsoft.Json.


Original answer:

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);
    }
}

8 Comments

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.serialization.javascriptserializer.aspx.
@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
here is online tool to convert your classes to json format, hope helps someone.
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."
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/…
|
141

Use Json.NET library, you can download it from NuGet Package 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 );

Comments

94

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, but as of .NET 5, you can change this by either adding [JsonInclude] to the fields you want to include, or by using JsonSerializerOptions:

using System.Text.Json;
// ...
var options = new JsonSerializerOptions { IncludeFields = true };
string json = JsonSerializer.Serialize(lad, options);

Documentation:

2 Comments

Side notes: (1) in order to manage a json serialization the properties of the class must have at least getters, (2) JsonSerializer.Serialize(lad) prints all in one line; if you want to get an indented printout use the json options, (3) I would rather override ToString() in the class itself, so that you have never have to write again the whole JsonSerializer.Serialize(lad) sentence, just put inside the class this: public override string ToString() => JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true });
"the System.Text.Json serializer currently doesn't serialize fields." Well, it can if you use JsonSerializer.Serialize(lad, new JsonSerializerOptions { IncludeFields = true });. Used in conjunction with @PaulEfford's comment, you can get a class that includes fields, as well as indenting the JSON
65

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.

7 Comments

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.
Oh, I missed the 2nd MSDN link :)
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."
@MichaelFreidgeim That's right, you have to mark properties in the class you want to serialize with attributes. DataContractAttribute DataMemberAttribute
@MichaelFreidgeim Which is better depends on the requirements. The attributes let you configure how the property is serialized.
|
38

You can achieve this by using Newtonsoft.json. Install Newtonsoft.json from NuGet. And then:

using Newtonsoft.Json;

var jsonString = JsonConvert.SerializeObject(obj);

Comments

26

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.

4 Comments

Good post, this is the most current way to do it.
I guess one expects to find a unit test under "The test" section, whereas there is none. btw, I like the approach where the Contact object knows how to convert itself to JSON. What I don't like in this example, is that the object is not actually an object from OOP perspective, rather than just bunch of public methods and properties.
"com.blogspot.jeanjmichel.jsontest.main" Ah, a Java programmer falls to the dark side. Welcome. We have cookies.
Hahahahaha yes @Corey =)
13

October 2023 update:

Another solution using built-in System.Text.Json (.NET Core 3.0+) where an object is self-sufficient and doesn't expose all possible fields:

A passing test (using NUnit):

using NUnit.Framework;

namespace Intech.UnitTests
{
    public class UserTests
    {
        [Test]
        public void ConvertsItselfToJson()
        {
            var userName = "John";
            var user = new User(userName);

            var actual = user.ToJson();

            Assert.AreEqual($"{{\"Name\":\"{userName}\"}}", actual);
        }
    }
}

An implementation:

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

namespace Intech
{
    public class User
    {
        private readonly string name;

        public User(string name)
        {
            this.name = name;
        }

        public string ToJson()
        {
            var params = new Dictionary<string, string>{{"Name", name}};
            return JsonSerializer.Serialize(params);
        }
    }
}

1 Comment

I am having to write code in a VM not connected to the internet, so this is very useful.
11

If they are not very big, what's probably your case export it as JSON.

Also this makes it portable among all platforms.

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);
}

Comments

10

In your Lad model class, add an override to the ToString() method that returns a JSON string version of your Lad object.
Note: you will need to import System.Text.Json;

using System.Text.Json;

class MyDate
{
    int year, month, day;
}

class Lad
{
    public string firstName { get; set; };
    public string lastName { get; set; };
    public MyDate dateOfBirth { get; set; };
    public override string ToString() => JsonSerializer.Serialize<Lad>(this);
}

2 Comments

JsonSerializer.Serialize<Lad>(this) can be simplified to JsonSerializer.Serialize(this)
Side notes: (1) in order to manage a json serialization the properties of the class must have at least getters, (2) JsonSerializer.Serialize(lad) prints all in one line; if you want to get an indented printout use the json options, (3) I would rather override ToString() like this: public override string ToString() => JsonSerializer.Serialize(this, new JsonSerializerOptions { WriteIndented = true });
8

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.

2 Comments

I get an error about not being able to cast jsonresult to string.
It will compile with implicit typing: var ladAsJson = Json(Lad).
6

I would vote for ServiceStack's JSON Serializer:

using ServiceStack;

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

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

5 Comments

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.
ServiceStack doesn't appear to be free.
@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.
Some benchmarks here, though there's non for the serialization on its own: docs.servicestack.net/real-world-performance
@joelnet Seems to be free now. Don't know when they changed it.
3

It is as easy as this (it works for dynamic objects as well (type object)):

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

3 Comments

there is no default script under web. :(
You are looking for this:msdn.microsoft.com/en-us/library/…
I kind of tried that but no. Script I guess I should add it as reference. So thanks a lot
1

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
  }
}

Comments

1

Here is another solution using Cinchoo ETL - an open source library

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; }
}

static void ToJsonString()
{
    var obj = new Lad
    {
        firstName = "Tom",
        lastName = "Smith",
        dateOfBirth = new MyDate
        {
            year = 1901,
            month = 4,
            day = 30
        }
    };
    var json = ChoJSONWriter.Serialize<Lad>(obj);

    Console.WriteLine(json);
}

Output:

{
  "firstName": "Tom",
  "lastName": "Smith",
  "dateOfBirth": {
    "year": 1901,
    "month": 4,
    "day": 30
  }
}

Disclaimer: I'm the author of this library.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.