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?

5

15 Answers

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

8

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

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

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

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:

1

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

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

Wooou! Really better using a JSON framework :)

Here is my example using Json.NET ():

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

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

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

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:

5

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

A passing test:

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

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

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

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.

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