如何将JSON映射到C#对象
本文关键字:对象 映射 JSON | 更新日期: 2023-09-27 18:29:45
我在理解如何实现这一点方面遇到了问题。
基本上我们有一个API,用户发送格式为:的JSON
{
"Profile":[
{
"Name":"Joe",
"Last":"Doe",
"Client":{
"ClientId":"1",
"Product":"Apple",
"Message":"Peter likes apples"
},
"Date":"2012-02-14"
}
]
}
我有一个名为Profile
的类,参数为Name
、Last
,还有一个作为其成员之一的对象Client
和属性Date
。
类似这样的东西:
public class Profile {
public string Name {get; set;}
public string Last {get; set;}
public Client client {get; set;}
public DateTime dDate {get; set;}
}
所以基本上,我不知道如何获取JSON,然后将其映射到我的对象。
任何关于";帮助;如果我能理解,我将不胜感激。
您可以使用Json.NET将Json字符串反序列化为(对类进行一些修改)
var yourObject = JsonConvert.DeserializeObject<Root>(jsonstring);
public class Root
{
public Profile[] Profile;
}
public class Profile
{
public string Name { get; set; }
public string Last { get; set; }
public Client Client { get; set; }
public DateTime Date { get; set; }
}
public class Client
{
public int ClientId;
public string Product;
public string Message;
}
您可以为此使用JSON库,例如免费的Newtonsoft.JSON。它会自动将json映射到您的类型。
样品:
public static T Deserialize<T>(string json)
{
Newtonsoft.Json.JsonSerializer s = new JsonSerializer();
return s.Deserialize<T>(new JsonTextReader(new StringReader(json)));
}
还有一个NuGet包可用。
我所知道的最简单的方法是使用newtonsoft的JSON.Net。为了更容易理解,我总是用相同的名称在C#中创建匹配的类。这样反序列化它就更容易了。例如,如果它是js中的一个对象数组,它将映射到C#中具有相同名称的对象列表。至于约会时间,这有点棘手。我在服务器端做客户端验证和Datetime.tryParse,它会处理短划线或斜杠。
var serializer = new JavaScriptSerializer();
List<abc> abcList = serializer.Deserialize<List<abc>>(PassedInJsonString);
我知道这是一个很长时间的问题,但我想再添加一个选项,不使用第三方库,只使用库存.Net库,并且从.Net Core 3.1开始提供。
首先,我留下一个指向Microsoft官方文档的链接(在那里你可以找到如何序列化和反序列化json字符串的示例):https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to
让我们以你的例子为基础。我们有我们的起始json字符串:
{
"Profile":[
{
"Name":"Joe",
"Last":"Doe",
"Client":{
"ClientId":"1",
"Product":"Apple",
"Message":"Peter likes apples"
},
"Date":"2012-02-14"
}
]
}
如果我们构建一个可以容纳该定义的数据结构,它将类似于:
public class Root
{
public List<Profile> Profile { get; set; }
}
public class Profile
{
public string Name { get; set; }
public string Last { get; set; }
public Client Client { get; set; }
public string Date { get; set; }
}
public class Client
{
public string ClientId { get; set; }
public string Product { get; set; }
public string Message { get; set; }
}
现在,也是最后关于如何在没有第三方库的情况下将json字符串反序列化为特定对象的答案:
Root root = JsonSerializer.Deserialize<Root>(json);
其中json
是包含json字符串的变量。
我添加了另一个感兴趣的链接,Deserialize(...)
方法的官方文档:https://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializer.deserialize
真正有用的是可以抛出的异常JsonException
:https://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsonexception
DataContractJsonSerializer完成了这项工作,但它使用更复杂的格式进行DateTime序列化。