如何将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的类,参数为NameLast,还有一个作为其成员之一的对象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映射到C#对象

您可以使用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序列化。