【问题标题】:How to map JSON to C# Objects如何将 JSON 映射到 C# 对象
【发布时间】:2012-04-16 19:40:22
【问题描述】:

我在理解如何实现这一点时遇到了问题。

基本上我们有一个 API,用户发送格式为 JSON 的:(如果代码不完美,请见谅)

{"Profile": [{
    "Name":"Joe",
    "Last :"Doe",
    "Client":
    {
        "ClientId":"1",
        "Product":"Apple",
        "Message":"Peter likes apples"
    },
    "Date":"2012-02-14",
}]}

好的,我不确定我的 JSON 格式是否正确,但现在这是我的问题。

我有一个名为 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,然后将其映射到我的对象。

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

【问题讨论】:

    标签: c# asp.net json


    【解决方案1】:

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

    【讨论】:

    • 酷,Root 类的作用是什么?,如果是新手问题,抱歉:)
    • 因为您的Profile 数组位于对象内部(json 的根对象没有像 xml 这样的名称)。我把它命名为Root,你可以选择任何你想要的名字
    • @Malice 链接如我所愿...我回滚了你的更新
    • @L.B 为什么 Json.Net 中的“t”不是链接的一部分对您很重要?这违反了网络惯例,所以一定有充分的理由。这是某种内幕笑话吗?
    【解决方案2】:

    您可以为此使用 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包,非常舒适
    • 如果字段名称不匹配则不匹配
    【解决方案3】:

    我知道的最简单的方法是使用 newtonsoft 的 JSON.Net。 为了更容易理解,我总是在 C# 中使用相同的名称匹配类。 然后更容易反序列化它。 例如,如果它是 js 中的对象数组,它将映射到 C# 中具有相同名称的对象列表。 至于日期时间,它有点棘手。 我在服务器端进行客户端验证和 Datetime.tryParse,它会处理破折号或斜杠。

    var serializer = new JavaScriptSerializer();
    List<abc> abcList = serializer.Deserialize<List<abc>>(PassedInJsonString);
    

    【讨论】:

      【解决方案4】:

      我知道这是一个由来已久的问题,但我想再添加一个选项,该选项不使用第三方库,仅使用库存 .Net 库,可从 . Net Core 3.1 及以上版本。

      首先,我留下一个微软官方文档的链接(您可以在其中找到有关如何序列化和反序列化 json 字符串的示例):https://docs.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://docs.microsoft.com/en-us/dotnet/api/system.text.json.jsonserializer.deserialize

      真正有用的是可以抛出的异常,JsonException:https://docs.microsoft.com/en-us/dotnet/api/system.text.json.jsonexception

      【讨论】:

        【解决方案5】:

        DataContractJsonSerializer 完成了这项工作,但它使用更复杂的格式进行 DateTime 序列化。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-09
          • 2019-05-27
          • 1970-01-01
          • 1970-01-01
          • 2012-04-23
          • 1970-01-01
          • 2010-09-10
          • 2013-06-16
          相关资源
          最近更新 更多