J'ai des cours comme ceux-ci:
class MyDate
{
int year, month, day;
}
class Lad
{
string firstName;
string lastName;
MyDate dateOfBirth;
}
Et j'aimerais transformer un objet Lad
en une chaîne JSON comme celle-ci:
{
"firstName":"Markoff",
"lastName":"Chaney",
"dateOfBirth":
{
"year":"1901",
"month":"4",
"day":"30"
}
}
(sans le formatage). J'ai trouvé ce lien , mais il utilise un espace de noms qui n'est pas dans .NET 4. J'ai aussi entendu parler de JSON.NET , mais leur site semble être en panne pour le moment, et je ne suis pas enthousiaste. sur l’utilisation de fichiers DLL externes. Existe-t-il d'autres options que la création manuelle d'un graveur de chaîne JSON?
Vous pouvez utiliser la classe JavaScriptSerializer
(ajoutez une référence à System.Web.Extensions
):
using System.Web.Script.Serialization;
var json = new JavaScriptSerializer().Serialize(obj);
Un exemple complet:
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);
}
}
Depuis que nous aimons tous un liners
... celui-ci dépend du paquet Newtonsoft NuGet, qui est populaire et meilleur que le sérialiseur par défaut.
Newtonsoft.Json.JsonConvert.SerializeObject(new {foo = "bar"})
Documentation: Serializing et Deserializing JSON
Utilisez Json.Net library, vous pouvez le télécharger à partir de Nuget Packet Manager.
Sérialisation sur 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);
Désérialisation en objet:
var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Lad>(jsonString );
Wooou! Vraiment mieux en utilisant un framework JSON :)
Voici mon exemple d'utilisation de 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
}
}
}
Le 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();
}
}
}
Le résultat:
{
"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
}
]
}
Maintenant, je vais implémenter la méthode du constructeur qui reçoit une chaîne JSON et remplit les champs de la classe.
Si vous êtes dans un contrôleur Web ASP.NET MVC, c'est aussi simple que:
string ladAsJson = Json(Lad);
Je ne peux pas croire que personne n'en a parlé.
Si elles ne sont pas très grandes, exportez-les probablement sous le format Json .
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);
}
Vous pouvez y parvenir en utilisant Newtonsoft.json. Installez Newtonsoft.json à partir de Nuget. et alors:
using Newtonsoft.Json;
var jsonString = JsonConvert.SerializeObject(obj);
Utilisez this tools pour générer la classe C #, puis utilisez ce code pour sérialiser votre objet.
var json = new JavaScriptSerializer().Serialize(obj);
Utilisez le code ci-dessous pour convertir XML en JSON.
var json = new JavaScriptSerializer().Serialize(obj);
Aussi facile que cela fonctionne pour les objets dynamiques (objet type):
string json = new
System.Web.Script.Serialization.JavaScriptSerializer().Serialize(MYOBJECT);
Je voterais pour le sérialiseur JSON de ServiceStack:
using ServiceStack.Text
string jsonString = new { FirstName = "James" }.ToJson();
C’est également le sérialiseur JSON le plus rapide disponible pour .NET: http://www.servicestack.net/benchmarks/
Il y a cet utilitaire vraiment astucieux ici: http://csharp2json.io/
Sérialiseur
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);
}
}
Objet
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;
}
}
La mise en oeuvre
var jsonObject = new AppConfigurationSettings();
WriteToJsonFile<AppConfigurationSettings>(file.FullName, jsonObject);
Sortie
{
"AppSettings": {
"DebugMode": false
}
}