我正在使用核心Web API,我面临着将不同的类对象嵌套到ArrayList中并通过FromBody
对象发送它们的挑战,问题是我必须将它们打包为在接收端将它们反序列化为各自的对象。 下面是一个示例。
[Serializable]
public class M1
{
public string Name { get; set; }
public int Age { get; set; }
}
[Serializable]
public class M2 : M1
{
public string Gender { get; set; }
public int Height { get; set; }
}
static void Main(string[] args)
{
try
{
M1 mObj = new M1();
M2 m2Obj = new M2();
ArrayList alist = new ArrayList();
mObj.Name = "Apple";
mObj.Age = 20;
m2Obj.Name = "Banana";
m2Obj.Age = 30;
m2Obj.Gender = "Male";
m2Obj.Height = 6;
alist.Add(mObj);
alist.Add(m2Obj);
string result = string.Empty;
M1 mObjD = new M1();
M2 mObj2D = new M2();
//Method1
try
{
result = Newtonsoft.Json.JsonConvert.SerializeObject(alist, Formatting.Indented);
mObjD = Newtonsoft.Json.JsonConvert.DeserializeObject<M1>(result);
mObj2D = Newtonsoft.Json.JsonConvert.DeserializeObject<M2>(result);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
//Method 2
try
{
result = Newtonsoft.Json.JsonConvert.SerializeObject(mObj, Formatting.Indented);
result = result + Newtonsoft.Json.JsonConvert.SerializeObject(m2Obj, Formatting.Indented);
mObjD = Newtonsoft.Json.JsonConvert.DeserializeObject<M1>(result);
mObj2D = Newtonsoft.Json.JsonConvert.DeserializeObject<M2>(result);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
对于第一种方法,它的抛出错误:
无法将当前 JSON 数组(例如[1,2,3])反序列化为类型"SerliazeDeserliaze.M1",因为该类型需要 JSON 对象(例如 {"name":"value"})才能正确反序列化。 要修复此错误,请将 JSON 更改为 JSON 对象(例如 {"name":"value"}),或者将反序列化类型更改为实现集合接口(例如 ICollection、IList)的类型数组,例如可以从 JSON 数组反序列化的列表。还可以将 JsonArrayAttribute 添加到类型中,以强制它从 JSON 数组反序列化。 路径 '',第 1 行,位置 1。
对于第二种方法,它说
读取完 JSON 内容后遇到的其他文本:{。路径 '',第 4 行,位置 2。
通过做一些黑客,我以不同的方式做了。
M1 mObj = new M1();
M2 m2Obj = new M2();
ArrayList alist = new ArrayList();
ArrayList alistb = new ArrayList();
mObj.Name = "Apple";
mObj.Age = 20;
m2Obj.Name = "Banana";
m2Obj.Age = 30;
m2Obj.Gender = "Male";
m2Obj.Height = 6;
alist.Add(mObj);
alist.Add(m2Obj);
string result = string.Empty;
M1 mObjD = new M1();
M2 mObj2D = new M2();
string json = JsonConvert.SerializeObject(alist, Formatting.Indented, new KeysJsonConverter(typeof(ArrayList)));
alistb= JsonConvert.DeserializeObject<ArrayList>(json, new KeysJsonConverter(typeof(ArrayList)));
mObjD = Newtonsoft.Json.JsonConvert.DeserializeObject<M1>(alistb[0].ToString());
mObj2D = Newtonsoft.Json.JsonConvert.DeserializeObject<M2>(alistb[1].ToString());
将列表序列化为 JSON,然后以反向方式反序列化即可完成工作。
如果你序列化对象列表,你也应该把它反序列化为 list:
string result = Newtonsoft.Json.JsonConvert.SerializeObject(aList, Formatting.Indented);
List<M1> mObjD = Newtonsoft.Json.JsonConvert.DeserializeObject<List<M1>>(result);
JSON 支持以下两种数据结构,
名称/值对的集合 - 此数据结构受不同编程语言的支持。 值的有序列表 - 它包括数组、列表、向量或序列等。 JSON 具有以下样式,
对象无序的"名称/值"程序集。对象以"{"开头,以"}"结尾。每个"名称"后面都有一个冒号。逗号用于分隔许多"名称/值"。例如
var user = {"name":"Manas","gender":"Male","birthday":"1987-8-8"}
数组值顺序集。数组以"["开头,以"]"结尾。值用逗号分隔。例如
var userlist = [{"user":{"name":"Manas","gender":"Male","birthday":"1987-8-8"}},
{"user":{"name":"Mohapatra","Male":"Female","birthday":"1987-7-7"}}]
字符串用引号括起来的任何数量的 Unicode 字符程序集。它使用反斜杠进行转义。
var userlist = "{"ID":1,"Name":"Manas","Address":"India"}"
We can implement JSON Serialization/Deserialization in the following three ways:
- 使用
JavaScriptSerializer
类 - 使用
DataContractJsonSerializer
类 - 使用 JSON.NET 库
- 使用
DataContractJsonSerializer
- DataContractJsonSerializer 类有助于序列化和反序列化 JSON。
- 它存在于命名空间
System.Runtime.Serialization.Json
中,即 提供组装System.Runtime.Serialization.dll
。使用 类我们可以将对象序列化为 JSON 数据并反序列化 JSON 数据到对象中。
假设有一个 Employee 类,其中还分配了名称、地址和属性值等属性。现在我们可以将 Employee 类实例转换为 JSON 文档。此 JSON 文档可以反序列化为 Employee 类或具有等效数据协定的另一个类。以下代码片段演示了有关序列化和反序列化的信息。
让我们创建一个用于序列化和反序列化的自定义类 BlogSite,
[DataContract]
class BlogSite
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Description { get; set; }
}
C# 序列化
在序列化中,它将自定义 .Net 对象转换为 JSON 字符串。在下面的代码中,它创建 BlogSiteclass 的实例,并为其属性赋值。然后我们通过传递参数 BlogSite 类来创建 DataContractJsonSerializer 类的实例,并创建一个 MemoryStream 类的实例来写入对象(BlogSite)。最后,它创建一个 StreamReader 类的实例,以从 MemorySteam 对象读取 JSON 数据。
BlogSite bsObj = new BlogSite()
{
Name = "C-sharpcorner",
Description = "Share Knowledge"
};
DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(BlogSite));
MemoryStream msObj = new MemoryStream();
js.WriteObject(msObj, bsObj);
msObj.Position = 0;
StreamReader sr = new StreamReader(msObj);
// "{"Description":"Share Knowledge","Name":"C-sharpcorner"}"
string json = sr.ReadToEnd();
sr.Close();
msObj.Close();
C# 反序列化
在反序列化中,它执行与序列化相反的操作,这意味着它将 JSON 字符串转换为自定义 .Net 对象。在下面的代码中,它创建 BlogSite 类的实例,并为其属性赋值。然后,我们通过传递参数 BlogSite 类并创建 MemoryStream 类的实例来创建 DataContractJsonSerializer 类的实例来编写对象(BlogSite)。最后,它创建一个 StreamReader 类的实例来从 MemorySteam 对象读取 JSON 数据。
string json = "{"Description":"Share Knowledge","Name":"C-sharpcorner"}";
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
// Deserialization from JSON
DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(BlogSite));
BlogSite bsObj2 = (BlogSite)deserializer.ReadObject(ms);
Response.Write("Name: " + bsObj2.Name); // Name: C-sharpcorner
Response.Write("Description: " + bsObj2.Description); // Description: Share Knowledge
}
C# Using JavaScriptJsonSerializer
JavaScriptSerializer 是一个帮助序列化和反序列化 JSON 的类。它存在于命名空间 System.Web.Script.Serialization 中,在程序集 System.Web.Extensions.dll 中可用。若要将 .Net 对象序列化为 JSON 字符串,请使用序列化方法。可以使用反序列化或反序列化对象方法将 JSON 字符串反序列化为 .Net 对象。让我们看看如何使用 JavaScriptSerializer 实现序列化和反序列化。
Following code, a snippet is to declare a custom class of BlogSites type.
class BlogSites
{
public string Name { get; set; }
public string Description { get; set; }
}
C# 序列化
在序列化中,它将自定义 .Net 对象转换为 JSON 字符串。在下面的代码中,它创建 BlogSiteclass 的实例,并为其属性分配一些值。然后我们创建一个 JavaScriptSerializer 的实例,并通过传递 object(BlogSites) 调用 Serialize() 方法。它以字符串格式返回 JSON 数据。
// Creating BlogSites object
BlogSites bsObj = new BlogSites()
{
Name = "C-sharpcorner",
Description = "Share Knowledge"
};
// Serializing object to json data
JavaScriptSerializer js = new JavaScriptSerializer();
string jsonData = js.Serialize(bsObj); // {"Name":"C-sharpcorner","Description":"Share Knowledge"}
C# 反序列化
在反序列化中,它执行与序列化相反的操作,这意味着它将 JSON 字符串转换为自定义 .Net 对象。在下面的代码中,它创建一个 JavaScriptSerializer 实例,并通过传递 JSON 数据调用 Deserialize()。它从 JSON 数据返回一个自定义对象(博客网站)。
// Deserializing json data to object
JavaScriptSerializer js = new JavaScriptSerializer();
BlogSites blogObject = js.Deserialize<BlogSites>(jsonData);
string name = blogObject.Name;
string description = blogObject.Description;
// Other way to whithout help of BlogSites class
dynamic blogObject = js.Deserialize<dynamic>(jsonData);
string name = blogObject["Name"];
string description = blogObject["Description"];
使用 Json.NET 的 C#
Json.NET 是一个第三方库,可帮助使用 JsonSerializer 在 JSON 文本和 .NET 对象之间进行转换。JsonSerializer 将 .NET 对象转换为其 JSON 等效文本,并通过将 .NET 对象属性名称映射到 JSON 属性名称来再次转换回来。它是开源软件,可免费用于商业目的。
以下是一些很棒的功能,
- 灵活的 JSON 序列化程序,用于在 .NET 对象和 JSON 之间进行转换。
- LINQ to JSON,用于手动读取和写入 JSON。
- 高性能,比 .NET 的内置 JSON 序列化程序。
- 易于阅读的 JSON。
- 将 JSON 与 XML 相互转换。 支持 .NET 2、.NET
- 3.5、.NET 4、Silverlight 和 Windows Phone。
让我们开始学习如何安装和实现:
在 Visual Studio 中,转到"工具"菜单 -> 选择"库包管理器"-">包管理器控制台"。它打开一个命令窗口,我们需要在其中放置以下命令来安装 Newtonsoft.Json。
Install-Package Newtonsoft.Json
或
在 Visual Studio 的"工具"菜单 ->"管理 Nuget 包管理器解决方案"中,键入"JSON.NET"以联机搜索。这是图,
Json.NET
Serialization
在序列化中,它将自定义 .Net 对象转换为 JSON 字符串。在下面的代码中,它创建 BlogSiteclass 的实例,并为其属性分配一些值。然后它通过传递对象(BlogSites)来调用JsonConvert类的静态方法SerializeObject()。它以字符串格式返回 JSON 数据。
// Creating BlogSites object
BlogSites bsObj = new BlogSites()
{
Name = "C-sharpcorner",
Description = "Share Knowledge"
};
// Convert BlogSites object to JOSN string format
string jsonData = JsonConvert.SerializeObject(bsObj);
Response.Write(jsonData);
C# 反序列化
在反序列化中,它执行与序列化相反的操作,这意味着它将 JSON 字符串转换为自定义 .Net 对象。在下面的代码中,它通过传递 JSON 数据来调用 JsonConvert 类的静态方法 DeserializeObject()。它从 JSON 数据返回一个自定义对象(博客网站)。
string json = @"{
'Name': 'C-sharpcorner',
'Description': 'Share Knowledge'
}";
BlogSites bsObj = JsonConvert.DeserializeObject<BlogSites>(json);
Response.Write(bsObj.Name);
JSON.NET,请访问此处。 在 Visual Studio 的"工具"菜单 ->"管理 Nuget 包管理器解决方案"中,键入"JSON.NET"以联机搜索。这是