如何将JSON映射到C#对象

30

我在理解如何实现这个过程方面遇到了问题。

基本上,我们有一个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并将其映射到我的对象。

对于“帮助”我理解的任何帮助都将不胜感激。

5个回答

55

您可以使用 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;
}

2
酷,Root类的作用是什么?如果这是一个新手问题,我很抱歉 :) - user710502
由于您的Profile数组位于一个对象内(JSON的根对象没有像XML那样的名称)。我将其命名为Root,您可以选择任何名称。 - L.B
@Malice 链接已经按照我的意愿进行了处理... 我撤销了你的更新。 - L.B
3
为什么你认为 "Json.Net" 中的 "t" 不应该作为链接的一部分很重要?这违反了网络约定,所以一定有很好的理由。这是一种内部笑话吗? - Raphael Schmitz

7
你可以使用一个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软件包。


只是提供信息,您也可以直接在VS中将其添加为Nuget包,这非常方便。 - Marek
如果字段名称不匹配,则无法进行操作。 - Kelso Sharp

1
我知道的最简单的方法是使用Newtonsoft的JSON.Net。 为了更容易理解,我总是在C#中创建与名称相同的匹配类。 然后更容易对其进行反序列化。 例如,如果它是js中的对象数组,则将映射到具有相同名称的对象列表。 至于日期时间,有点棘手。 我会在客户端验证和服务器端使用Datetime.tryParse来处理破折号或斜杠。
var serializer = new JavaScriptSerializer();
List<abc> abcList = serializer.Deserialize<List<abc>>(PassedInJsonString);

1
我知道这是一个长期存在的问题,但我想再添加一种选项,它不使用第三方库,只使用股票.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

非常有用的是可以抛出的异常 JsonExceptionhttps://learn.microsoft.com/en-us/dotnet/api/system.text.json.jsonexception


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接