我有这样的课程:
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"
}
}
(没有格式化)。我找到了this link,但它使用的是一个不在.NET 4中的命名空间。我也听说过JSON.NET,但他们的网站目前似乎已经关闭,而且我并不热衷于使用外部DLL文件。除了手动创建JSON字符串编写器之外还有其他选项吗?
答案 0 :(得分:851)
因为我们都喜欢一个衬垫
...这个依赖于Newtonsoft NuGet软件包,它比默认的序列化程序更受欢迎。
Newtonsoft.Json.JsonConvert.SerializeObject(new {foo = "bar"})
答案 1 :(得分:793)
您可以使用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);
}
}
答案 2 :(得分:66)
使用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 );
答案 3 :(得分:53)
使用DataContractJsonSerializer
课程:MSDN1,MSDN2。
我的例子:HERE。
与JavaScriptSerializer
不同,它还可以安全地从JSON字符串反序列化对象。但我个人仍然更喜欢Json.NET。
答案 4 :(得分:21)
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字符串并填充类的字段。
答案 5 :(得分:15)
您可以使用Newtonsoft.json来实现。从Nuget安装Newtonsoft.json。然后:
using Newtonsoft.Json;
var jsonString = JsonConvert.SerializeObject(obj);
答案 6 :(得分:11)
System.Text.Json
名称空间中提供了一个新的JSON序列化器。它包含在.NET Core 3.0共享框架中,并位于NuGet package中,用于面向.NET Standard或.NET Framework或.NET Core 2.x的项目。
示例代码:
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);
}
}
在此示例中,要序列化的类具有属性而非字段; System.Text.Json
序列化程序当前不对字段进行序列化。
文档:
答案 7 :(得分:5)
如果它们不是很大,那么你的情况可能就是将它作为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);
}
答案 8 :(得分:4)
如果您在ASP.NET MVC Web控制器中,它就像:
一样简单{{1}}
无法相信没有人提到这一点。
答案 9 :(得分:2)
使用以下代码将XML转换为JSON。
var json = new JavaScriptSerializer().Serialize(obj);
答案 10 :(得分:2)
这很简单,也适用于动态对象(类型对象):
string json = new
System.Web.Script.Serialization.JavaScriptSerializer().Serialize(MYOBJECT);
答案 11 :(得分:2)
使用this tools生成C#类,然后使用此代码序列化您的对象
var json = new JavaScriptSerializer().Serialize(obj);
答案 12 :(得分:1)
这是另一个使用 Cinchoo ETL 的解决方案 - 一个开源库
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);
}
输出:
{
"firstName": "Tom",
"lastName": "Smith",
"dateOfBirth": {
"year": 1901,
"month": 4,
"day": 30
}
}
免责声明:我是这个库的作者。
答案 13 :(得分:1)
另一种使用 System.Text.Json
(.NET Core 3.0+、.NET 5)的解决方案,其中对象是自给自足的,并且不会公开所有可能的字段:
通过测试:
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);
}
}
}
一个实现:
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);
}
}
}
答案 14 :(得分:1)
我会投票支持ServiceStack的JSON Serializer:
using ServiceStack.Text
string jsonString = new { FirstName = "James" }.ToJson();
它也是.NET最快的JSON序列化程序: http://www.servicestack.net/benchmarks/
答案 15 :(得分:0)
这里有一个非常好的实用工具:http://csharp2json.io/
答案 16 :(得分:0)
<强>串行强>
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
}
}
答案 17 :(得分:0)
在您的 Lad 模型类中,向 ToString() 方法添加覆盖,该方法返回您的 Lad 对象的 JSON 字符串版本。
注意:您需要导入 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);
}
答案 18 :(得分:-7)
注意使用正确的属性创建您的课程:
使用&lt; Serializable&gt;创建此类根据示例C#示例的属性,后跟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示例
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
结束命名空间
第二步是创建一个简单的测试数据,如下所示:
<强> 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
这是最终结果:
{"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的引用,以实现您的目标。