Hoe verander ik een C#-object in een JSON-tekenreeks in .NET?

Ik heb lessen zoals deze:

class MyDate
{
    int year, month, day;
}
class Lad
{
    string firstName;
    string lastName;
    MyDate dateOfBirth;
}

En ik zou van een Lad-object een JSON-tekenreeks willen maken, zoals deze:

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

(Zonder de opmaak). Ik vond deze link , maar het gebruikt een naamruimte die zich niet in .NET 4bevindt. Ik heb ook gehoord over JSON.NET, maar hun site lijkt op de moment, en ik ben niet happig op het gebruik van externe DLL-bestanden.

Zijn er andere opties naast het handmatig maken van een JSONtekenreeksschrijver?


Antwoord 1, autoriteit 100%

U kunt de JavaScriptSerializerklasse (voeg een verwijzing toe naar System.Web.Extensions):

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

Een volledig voorbeeld:

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

Antwoord 2, autoriteit 93%

Omdat we allemaal van oneliners houden

… deze hangt af van het Newtonsoft NuGet-pakket, dat populair en beter is dan de standaard serializer.

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

Documentatie: JSON serialiseren en deserialiseren


Antwoord 3, autoriteit 12%

Gebruik Json.Net-bibliotheek, u kunt deze downloaden van Nuget Packet Manager.

Serialiseren naar 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 );

Antwoord 4, Autoriteit 6%

Gebruik de DataContractJsonSerializerKlasse: MSDN1 , MSDN2 .

Mijn voorbeeld: hier .

Het kan ook veilig objecten uit een JSON-string, in tegenstelling tot JavaScriptSerializer. Maar persoonlijk geef ik nog steeds liever json.net .


Antwoord 5, Autoriteit 4%

Een nieuwe JSON Serializer is beschikbaar in de System.Text.Jsonnamespace. Het is opgenomen in het gedeelde kader van de .NET Core 3.0 en is in een nuget pakket voor Projecten die zich richten op .NET-standaard of .NET Framework of .NET CORE 2.X.

Voorbeeldcode:

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 dit voorbeeld hebben de te serialiseren klassen eigenschappen in plaats van velden; de System.Text.Jsonserializer rangschikt momenteel geen velden.

Documentatie:


Antwoord 6, autoriteit 3%

U kunt dit bereiken door Newtonsoft.json te gebruiken. Installeer Newtonsoft.json van NuGet. En dan:

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

Antwoord 7, autoriteit 3%

Wauw! Echt beter met een JSON-framework 🙂

Hier is mijn voorbeeld met 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
        }
    }
}

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

Het resultaat:

{
  "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
    }
  ]
}

Nu zal ik de constructormethode implementeren die een JSON-tekenreeks ontvangt en de velden van de klasse vult.


Antwoord 8

Als ze niet erg groot zijn, wat is dan waarschijnlijk exporteren als JSON.

Dit maakt het ook draagbaar bij alle 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);
}

Antwoord 9

Als u in een ASP.NET MVC-webcontroller bent, is het zo eenvoudig als:

string ladAsJson = Json(Lad);

kan niet geloven dat niemand dit heeft genoemd.


Antwoord 10

Ik zou stemmen op de JSON SERIALIZER van ServicEstack:

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

Het is ook de snelste JSON-serializer beschikbaar voor .NET:
http://www.servicEtack.net/benchmarks/


Antwoord 11

Gebruik deze tools voor het genereren van een C # -klasse en gebruik dan deze code om uw object te serialiseren:

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

Antwoord 12

Zo eenvoudig is het (het werkt ook voor dynamische objecten (type object)):

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

Antwoord 13

Gebruik de onderstaande code om XML naar JSON te converteren.

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

Antwoord 14

Een andere oplossing die gebruik maakt van System.Text.Json(.NET Core 3.0+, .NET 5) waarbij een object zelfvoorzienendis en niet alle mogelijke blootlegt velden:

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

Een implementatie:

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

Antwoord 15

Hier is een andere oplossing met behulp van Cinchoo ETL– een open source bibliotheek

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: ik ben de auteur van deze bibliotheek.


Antwoord 16

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

Implementatie

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

Uitvoer

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

Antwoord 17

Voeg in uw Lad-modelklasse een override toe aan de methode ToString()die een JSON-tekenreeksversie van uw Lad-object retourneert.
Opmerking: u moet System.Text.Json;

. importeren

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

Other episodes