Как превратить объект C # в строку JSON в .NET?

625

У меня есть такие классы:

class MyDate
{
    int year, month, day;
}

class Lad
{
    string firstName;
    string lastName;
    MyDate dateOfBirth;
}

И я хотел бы превратить объект Lad в строку JSON следующим образом:

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

(без форматирования). Я нашел эту ссылку, но использует пространство имен, которое не в .NET 4. Я также слышал о JSON.NET, но их сайт, похоже, сейчас не работает, и я не заинтересован в использовании внешних DLL файлов. Существуют ли другие возможности, помимо ручного создания строковой записи JSON?

  • 1
    JSON.net можно загрузить здесь . Другим и более быстрым (как говорят - я сам не тестировал) решением является ServiceStack.Text Я бы не рекомендовал запускать собственный JSON-анализатор. Это, вероятно, будет медленнее и более подвержено ошибкам, или вам придется потратить много времени.
  • 0
    да. C # имеет тип с именем JavaScriptSerializer
Показать ещё 3 комментария
Теги:
serialization

14 ответов

732
Лучший ответ

Вы можете использовать класс JavaScriptSerializer (добавьте ссылку на System.Web.Extensions):

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

Полный пример:

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);
    }
}
  • 64
    Пожалуйста, имейте в виду, что Microsoft предлагает использовать JSON.net вместо этого решения. Я думаю, что этот ответ стал неуместным. Посмотрите на ответ Уилстила. Источник: https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx .
  • 8
    @DarinDimitrov Вы должны добавить подсказку о JSON.net. Microsoft рекомендует это через JavascriptSerializer: msdn.microsoft.com/en-us/library/… Вы также можете добавить подсказку к msdn.microsoft.com/en-us/library/…, который является подходом, включенным в структуру
Показать ещё 6 комментариев
662

Так как мы все любим один лайнер

... это зависит от пакета Newtonsoft NuGet, который является популярным и лучше, чем сериализатор по умолчанию.

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

Документация: Сериализация и десериализация JSON

  • 116
    Сериализатор Newtonsoft намного быстрее и более настраиваемый, чем встроенный. Настоятельно рекомендуем его использовать. Спасибо за ответ @willsteel
  • 0
    Стоит отметить, что это не совсем бесплатно. Смотрите / расценки на сайте.
Показать ещё 7 комментариев
53

Используйте класс DataContractJsonSerializer: MSDN1, MSDN2.

Мой пример: ЗДЕСЬ.

Он также может безопасно десериализовать объекты из строки JSON, в отличие от JavaScriptSerializer. Но лично я до сих пор предпочитаю Json.NET.

  • 5
    Не говоря уже о том, что он не зависит от пространств имен System.Web.Xyz ...
  • 1
    Все еще не вижу примеров на этой странице , но вот некоторые из них на MSDN и в других местах -> последний использует методы расширения для достижения однострочников.
Показать ещё 6 комментариев
35

Используйте Json.Net, вы можете загрузить его из Nuget Packet Manager.

Сериализация для строки Json:

 var obj = new Lad
        {
            firstName = "Markoff",
            lastName = "Chaney",
            dateOfBirth = new MyDate
            {
                year = 1901,
                month = 4,
                day = 30
            }
        };

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

Дессериализация объекта:

var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<Lad>(jsonString );
18

Wooou! На самом деле лучше использовать структуру JSON:)

Вот мой пример использования 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
        }
    }
}

Тест:

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

Результат:

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

Теперь я реализую метод конструктора, который получит строку JSON и заполняет поля класса.

  • 1
    Хороший пост, это самый актуальный способ сделать это.
3

Если они не очень большие, возможно, ваш случай экспортирует его как 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);
    }
3

Если вы находитесь в веб-контроллере ASP.NET MVC, это просто:

string ladAsJson = Json(Lad);

Не могу поверить, что никто не упомянул об этом.

  • 0
    Я получаю ошибку о невозможности привести jsonresult к строке.
  • 0
    Он будет компилироваться с неявной типизацией: var ladAsJson = Json (Lad).
2

используйте эти инструменты для создания класса С#

и используйте этот код

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

для сериализации вашего объекта

2

Так же просто, как и для динамических объектов (тип объекта):

string json = new
System.Web.Script.Serialization.JavaScriptSerializer().Serialize(MYOBJECT);
  • 0
    в сети нет скрипта по умолчанию. :(
  • 0
    Вы ищете это: msdn.microsoft.com/en-us/library/…
Показать ещё 1 комментарий
2

Используйте приведенный ниже код для преобразования XML в JSON.

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

Я бы проголосовал за Serializer ServiceStack JSON:

using ServiceStack.Text

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

Это также самый быстрый JSON-сериализатор, доступный для .NET: http://www.servicestack.net/benchmarks/

  • 4
    Это очень старые тесты. Я только что протестировал все три текущие версии Newtonsoft, ServiceStack и JavaScriptSerializer, и в настоящее время Newtonsoft является самой быстрой. То они все делают довольно быстро.
  • 1
    ServiceStack не является бесплатным.
Показать ещё 3 комментария
0

Здесь есть очень полезная утилита: http://csharp2json.io/

0

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

Объект

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

Реализация

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

Выход

{
  "AppSettings": {
    "DebugMode": false
  }
}
-6

Позаботьтесь о создании своего класса с соответствующим атрибутом:

Создайте этот класс с атрибутом <Serializable> в соответствии с примером примера С#, за которым следует vb.net exmpale

С#

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

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

Конечное пространство имен

Второй шаг - создать простые тестовые данные, например:

С#

  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

И это конечный результат:

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

Не забудьте добавить ссылку на system.web.extension.dll, чтобы достичь своей цели.

  • 11
    Извините, но какой смысл предлагать ваш ответ на вопрос с хорошим ответом, особенно если он не на том же языке программирования?
  • 0
    Это просто :) => кто-нибудь может пойти сюда и перевести это developerfusion.com/tools/convert/csharp-to-vb, который я забыл упомянуть в посте. Обычно я использую, чтобы опубликовать оба предложения в этом случае, я забываю это :) LOL, вот и все. C # и vbnet могут быть переведены простым способом, и это очень полезно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню