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?
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
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);
}
}
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 );
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:
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 ( 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.
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.
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/
Use these tools for generating a C# class, and then use this code to serialize your object:
var json = new JavaScriptSerializer().Serialize(obj);
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);
Use the below code for converting XML to JSON.
var json = new JavaScriptSerializer().Serialize(obj);
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);
}
}
}
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
}
}
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);
}
There is this really nifty utility right here: http://csharp2json.io/
Take care to create your class with the right attribute too:
Create this class with <Serializable> attribute as per the example C# example followed by vb.net exmpale
C#
using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Script.Serialization;
namespace Samples
{
[Serializable()]
public class Customer
{
private int _idcustomer;
public int IDCustomer {
get { return _idcustomer; }
set { _idcustomer = value; }
}
private System.DateTime _RegistrationDate;
public System.DateTime RegistrationDate {
get { return _RegistrationDate; }
set { _RegistrationDate = value; }
}
private string _Name;
public string Name {
get { return _Name; }
set { _Name = value; }
}
private string _Surname;
public string Surname {
get { return _Surname; }
set { _Surname = value; }
}
}
[Serializable()]
public class Product
{
private int _ProductID;
public int ProductID {
get { return _ProductID; }
set { _ProductID = value; }
}
private string _ProductName;
public string ProductName {
get { return _ProductName; }
set { _ProductName = value; }
}
private int _Price;
public int Price {
get { return _Price; }
set { _Price = value; }
}
private bool _inStock;
public bool inStock {
get { return _inStock; }
set { _inStock = value; }
}
}
[Serializable()]
public class Order
{
private int _OrderId;
public int OrderID {
get { return _OrderId; }
set { _OrderId = value; }
}
private int _customerID;
public int CustomerID {
get { return _customerID; }
set { _customerID = value; }
}
private List<Product> _ProductsList;
public List<Product> ProductsList {
get { return _ProductsList; }
set { _ProductsList = value; }
}
private System.DateTime _PurchaseDate;
public System.DateTime PurchaseDate {
get { return _PurchaseDate; }
set { _PurchaseDate = value; }
}
private string _PaymentMethod;
public string PaymentMethod {
get { return _PaymentMethod; }
set { _PaymentMethod = value; }
}
public string ToJson()
{
string json = string.Empty;
JavaScriptSerializer js = new JavaScriptSerializer();
json = js.Serialize(this);
js = null;
return json;
}
}
}
VBNET EXAMPLE
Imports System
Imports System.Web
Imports System.Web.Script.Serialization
Namespace Samples
<Serializable()>
Public Class Customer
Private _idcustomer As Integer
Public Property IDCustomer() As Integer
Get
Return _idcustomer
End Get
Set(ByVal value As Integer)
_idcustomer = value
End Set
End Property
Private _RegistrationDate As Date
Public Property RegistrationDate() As Date
Get
Return _RegistrationDate
End Get
Set(ByVal value As Date)
_RegistrationDate = value
End Set
End Property
Private _Name As String
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Private _Surname As String
Public Property Surname() As String
Get
Return _Surname
End Get
Set(ByVal value As String)
_Surname = value
End Set
End Property
End Class
<Serializable()>
Public Class Product
Private _ProductID As Integer
Public Property ProductID() As Integer
Get
Return _ProductID
End Get
Set(ByVal value As Integer)
_ProductID = value
End Set
End Property
Private _ProductName As String
Public Property ProductName() As String
Get
Return _ProductName
End Get
Set(ByVal value As String)
_ProductName = value
End Set
End Property
Private _Price As Integer
Public Property Price() As Integer
Get
Return _Price
End Get
Set(ByVal value As Integer)
_Price = value
End Set
End Property
Private _inStock As Boolean
Public Property inStock() As Boolean
Get
Return _inStock
End Get
Set(ByVal value As Boolean)
_inStock = value
End Set
End Property
End Class
<Serializable>
Public Class Order
Private _OrderId As Integer
Public Property OrderID() As Integer
Get
Return _OrderId
End Get
Set(ByVal value As Integer)
_OrderId = value
End Set
End Property
Private _customerID As Integer
Public Property CustomerID() As Integer
Get
Return _customerID
End Get
Set(ByVal value As Integer)
_customerID = value
End Set
End Property
Private _ProductsList As List(Of Product)
Public Property ProductsList() As List(Of Product)
Get
Return _ProductsList
End Get
Set(ByVal value As List(Of Product))
_ProductsList = value
End Set
End Property
Private _PurchaseDate As Date
Public Property PurchaseDate() As Date
Get
Return _PurchaseDate
End Get
Set(ByVal value As Date)
_PurchaseDate = value
End Set
End Property
Private _PaymentMethod As String
Public Property PaymentMethod() As String
Get
Return _PaymentMethod
End Get
Set(ByVal value As String)
_PaymentMethod = value
End Set
End Property
Public Function ToJson() As String
Dim json As String = String.Empty
Dim js As New JavaScriptSerializer
json = js.Serialize(Me)
js = Nothing
Return json
End Function
End Class
End Namespace
The second step is to create a simple test data like this:
C#
void Main() {
List<Samples.Product> ListProducts = new List<Samples.Product>();
ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10, .ProductID=1,.ProductName=BookOne);
ListProducts.Add(new Samples.Product(), With, {.inStock=False,. Price=10, .ProductID=2, .ProductName=Hotels California);
ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10,.ProductID=3,.ProductName=Cbr);
ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10,.ProductID=4,.ProductName=Mustang);
ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10, .ProductID=15,.ProductName=Anything);
ListProducts.Add(new Samples.Product(), With, {.inStock=False,.Price=10,.ProductID=38,.ProductName=Monster Truck);
Samples.Customer Customer = new Samples.Customer();
// With...
Customer.IDCustomer = 1;
Customer.Name = "Customer1";
Customer.RegistrationDate = Now;
Customer.Surname = "SurnameCustomer";
Samples.Order Order = new Samples.Order();
// With...
Order.CustomerID = Customer.IDCustomer;
Order.OrderID = 1;
Order.PaymentMethod = "PayPal";
Order.ProductsList = ListProducts;
Order.PurchaseDate = Now;
Console.WriteLine(Order.ToJson);
Console.ReadLine();
}
VB.NET
Sub Main()
Dim ListProducts As New List(Of Samples.Product)
ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10,
.ProductID = 1, .ProductName = "BookOne"})
ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10,
.ProductID = 2, .ProductName = "Hotels California"})
ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10,
.ProductID = 3, .ProductName = "Cbr"})
ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10,
.ProductID = 4, .ProductName = "Mustang"})
ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10,
.ProductID = 15, .ProductName = "Anything"})
ListProducts.Add(New Samples.Product With {.inStock = False, .Price = 10,
.ProductID = 38, .ProductName = "Monster Truck"})
Dim Customer As New Samples.Customer
With {.IDCustomer = 1, .Name = "Customer1",.RegistrationDate = Now, .Surname ="SurnameCustomer"}
Dim Order As New Samples.Order With {
.CustomerID = Customer.IDCustomer,
.OrderID = 1,
.PaymentMethod = "PayPal",
.ProductsList = ListProducts,
.PurchaseDate = Now
}
Console.WriteLine(Order.ToJson)
Console.ReadLine()
End Sub
And this is the final result:
{"OrderID":1,"CustomerID":1,"ProductsList":[{"ProductID":1,"ProductName":"BookOn
e","Price":10,"inStock":false},{"ProductID":2,"ProductName":"Hotels California",
"Price":10,"inStock":false},{"ProductID":3,"ProductName":"Cbr","Price":10,"inSto
ck":false},{"ProductID":4,"ProductName":"Mustang","Price":10,"inStock":false},{"
ProductID":15,"ProductName":"Anything","Price":10,"inStock":false},{"ProductID":
38,"ProductName":"Monster Truck","Price":10,"inStock":false}],"PurchaseDate":"\/
Date(1396642206155)\/","PaymentMethod":"PayPal"}
Remember to add a reference to system.web.extension.dll in order to achive your goal.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.