【问题标题】:How do I deserialize a complex JSON object in C# .NET?如何在 C# .NET 中反序列化复杂的 JSON 对象?
【发布时间】:2013-04-26 16:36:00
【问题描述】:

我有一个 JSON 字符串,我需要一些帮助来反序列化它。

没有什么对我有用...这是 JSON:

{
    "response": [{
        "loopa": "81ED1A646S894309CA1746FD6B57E5BB46EC18D1FAff",
        "drupa": "D4492C3CCE7D6F839B2BASD2F08577F89A27B4ff",
        "images": [{
                "report": {
                    "nemo": "unknown"
                },
                "status": "rock",
                "id": "7e6ffe36e-8789e-4c235-87044-56378f08m30df",
                "market": 1
            },
            {
                "report": {
                    "nemo": "unknown"
                },
                "status": "rock",
                "id": "e50e99df3-59563-45673-afj79e-e3f47504sb55e2",
                "market": 1
            }
        ]
    }]
}

我有一个类的示例,但我不必使用这些类。我不介意使用其他类。

这些是类:

public class Report
{
    public string nemo { get; set; }
}

public class Image
{
    public Report report { get; set; }
    public string status { get; set; }
    public string id { get; set; }
    public int market { get; set; }
}

public class Response
{
    public string loopa { get; set; }
    public string drupa{ get; set; }
    public Image[] images { get; set; }
}

public class RootObject
{
    public Response[] response { get; set; }
}

我想提一下,我已经有了 Newtonsoft.Json,所以我可以使用那里的一些功能。

我该怎么做?

【问题讨论】:

  • 是否有异常抛出?错误信息是什么?能否请您发布反序列化代码?
  • 没有例外,我只是没有得到任何数据。并在快速视图中得到这个:名称'在当前上下文中不存在
  • 查看答案并勾选正确的以结束此问题。

标签: c# .net json deserialization


【解决方案1】:

我在我的代码中使用这样的,它工作正常

下面是你需要编写的一段代码

using System.Web.Script.Serialization;

JavaScriptSerializer oJS = new JavaScriptSerializer();
RootObject oRootObject = new RootObject();
oRootObject = oJS.Deserialize<RootObject>(Your JSon String);

【讨论】:

  • 仅供参考:这是在 System.Web.Extensions.dll 中
  • 在哪里可以找到 RootObject 类??!
  • @Mich,RootObject 类是作为问题代码末尾的模型类的一部分提供的。
  • @Javal Patel - 强大的东西! “自动命名”映射节省了编写大量映射代码。谢谢分享!
【解决方案2】:

应该是这样的:

var jobject = JsonConvert.DeserializeObject<RootObject>(jsonstring);

您可以将 json 字符串粘贴到此处:http://json2csharp.com/ 以检查您的类是否正确。

【讨论】:

  • 我试过这个,但在进入快速视图时我只得到“名称'在当前上下文中不存在”
  • 您是否按照我链接的网站尝试过课程?我看到它们的不同之处在于它们使用 List 而不是 RootObject 和 Response 类中的数组。不确定它是否会有所作为。
  • 是的,我为了测试而改变了它,但原件来自这个网站
【解决方案3】:

如果你使用 C# 2010 或更新版本,你可以使用dynamic type

dynamic json = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonstring);

然后您可以使用点符号访问动态对象中的属性和数组:

string nemo = json.response[0].images[0].report.nemo;

【讨论】:

  • 可能是个好主意,但对我不起作用:找不到编译动态表达式所需的一个或多个类型。您是否缺少参考文献
【解决方案4】:

首先使用NuGet Package Managernewtonsoft.json包安装到Visual Studio,然后添加以下代码:

ClassName ObjectName = JsonConvert.DeserializeObject < ClassName > (jsonObject);

【讨论】:

  • 但这会处理这个特定 JSON 中的不规则类型(在问题中)。你真的试过运行它吗?
【解决方案5】:

我有一个场景,这个场景帮助了我

JObjectobjParserd = JObject.Parse(jsonString);

JObjectarrayObject1 = (JObject)objParserd["d"];

DmyOutput= JsonConvert.DeserializeObject&lt;D&gt;(arrayObject1.ToString());

【讨论】:

    【解决方案6】:

    shareInfo 是类:

    public class ShareInfo
            {
                [JsonIgnore]
                public readonly DateTime Timestamp = DateTime.Now;
                [JsonProperty("sharename")]
                public string ShareName = null;
                [JsonProperty("readystate")]
                public string ReadyState = null;
                [JsonProperty("created")]
                [JsonConverter(typeof(Newtonsoft.Json.Converters.UnixDateTimeConverter))]
                public DateTime? CreatedUtc = null;
                [JsonProperty("title")]
                public string Title = null;
                [JsonProperty("getturl")]
                public string GettUrl = null;
                [JsonProperty("userid")]
                public string UserId = null;
                [JsonProperty("fullname")]
                public string Fullname = null;
                [JsonProperty("files")]
                public GettFile.FileInfo[] Files = new GettFile.FileInfo[0];
            }
    
    // POST request.
                var gett = new WebClient { Encoding = Encoding.UTF8 };
                gett.Headers.Add("Content-Type", "application/json");
                byte[] request = Encoding.UTF8.GetBytes(jsonArgument.ToString());
                byte[] response = gett.UploadData(baseUri.Uri, request);
    
                // Response.
                var shareInfo = JsonConvert.DeserializeObject<ShareInfo>(Encoding.UTF8.GetString(response));
    

    【讨论】:

      【解决方案7】:
       public static void Main(string[] args)
      {
          string json = @" {
          ""children"": [
                  {
              ""url"": ""foo.pdf"", 
                      ""expanded"": false, 
                      ""label"": ""E14288-Passive-40085-2014_09_26.pdf"", 
                      ""last_modified"": ""2014-09-28T11:19:49.000Z"", 
                      ""type"": 1, 
                      ""size"": 60929
                  }
              ]
           }";
      
      
      
      
          var result = JsonConvert.DeserializeObject<ChildrenRootObject>(json);
          DataTable tbl = DataTableFromObject(result.children);
      }
      
      public static DataTable DataTableFromObject<T>(IList<T> list)
      {
          DataTable tbl = new DataTable();
          tbl.TableName = typeof(T).Name;
      
          var propertyInfos = typeof(T).GetProperties();
          List<string> columnNames = new List<string>();
      
          foreach (PropertyInfo propertyInfo in propertyInfos)
          {
              tbl.Columns.Add(propertyInfo.Name, propertyInfo.PropertyType);
              columnNames.Add(propertyInfo.Name);
          }
      
          foreach(var item in list)
          {
              DataRow row = tbl.NewRow();
              foreach (var name in columnNames)
              {
                  row[name] = item.GetType().GetProperty(name).GetValue(item, null);
              }
      
              tbl.Rows.Add(row);
          }
      
          return tbl;
      }
      
      public class Child
      {
          public string url { get; set; }
          public bool expanded { get; set; }
          public string label { get; set; }
          public DateTime last_modified { get; set; }
          public int type { get; set; }
          public int size { get; set; }
      }
      
      public class ChildrenRootObject
      {
          public List<Child> children { get; set; }
      }
      

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
      【解决方案8】:

      我正在使用以下内容:

          using System.Web.Script.Serialization;       
      
          ...
      
          public static T ParseResponse<T>(string data)
          {
              return new JavaScriptSerializer().Deserialize<T>(data);
          }
      

      【讨论】:

        【解决方案9】:

        我解决了这个问题,为所有属性添加了一个公共设置器,应该反序列化。

        【讨论】:

          【解决方案10】:

          你可以像下面一堆代码来解决你的问题

          public class Response
          {
              public string loopa { get; set; }
              public string drupa{ get; set; }
              public Image[] images { get; set; }
          }
          
          public class RootObject<T>
              {
                  public List<T> response{ get; set; }
          
              }
          
          var des = (RootObject<Response>)Newtonsoft.Json.JsonConvert.DeserializeObject(Your JSon String, typeof(RootObject<Response>));
          

          【讨论】:

            【解决方案11】:

            我还遇到了在 C# 中解析和使用 JSON 对象的问题。我用一些库检查了动态类型,但问题总是检查属性是否存在。

            最后,我偶然发现了this web page,这为我节省了很多时间。它会根据您的 JSON 数据自动创建一个强类型类,您将使用它与 Newtonsoft 库一起使用,并且运行良好。它也适用于 C# 以外的语言。

            【讨论】:

            • 但这会处理这个特定 JSON 中的不规则类型(在问题中)。你真的试过运行它吗?
            • 它很好地处理了缺少的 json 属性(当它识别出对象数组中不重复的属性时,它会自动转换为可为空的类型)。当然,如果 json 是完全不规则/随机的,那么拥有一个 c# 转换器类是没有意义的。在这些情况下,使用动态是要走的路。在复杂的情况下,比如我正在做的项目,我不得不进行一些小的手动调整,例如将一些整数类型转换为十进制(如果您提交的样本不包含小数),手动添加可空值,...跨度>
            【解决方案12】:

            您可以使用 nuget 包 Newtonsoft.JSON 来实现此目的:

            JsonConvert.DeserializeObject<List<Response>>(yourJsonString)
            

            【讨论】:

            • 欢迎来到 Stack Overflow。也许一些clearer formatting 可以帮助您改善答案。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-09-23
            • 1970-01-01
            相关资源
            最近更新 更多