【问题标题】:How to Desrialize JSON using C#如何使用 C# 反序列化 JSON
【发布时间】:2011-06-02 13:28:27
【问题描述】:

我目前正在使用 Json.Net 反序列化我的 JSON。我现在有以下情况:

我收到以下 JSON 响应:

{"Success":false,"Errors":{"UserName":"User Name already registered","EmailAddress":"Email Address already registered"}}

我想解析成这种类型:

public class CustomJsonResult
{
    public bool Success { get; set; }
    public string[] Errors { get; set; }
}

使用 Json.net,我尝试这样做:

CustomJsonResult regResult = JsonConvert.DeserializeObject<CustomJsonResult>(json);

但这不起作用,我收到错误无法将 JSON 对象反序列化为类型“System.String[]”。

我该如何解决这个问题? (使用 Json.Net 或任何其他库)

【问题讨论】:

    标签: c# asp.net json serialization


    【解决方案1】:

    问题是您正在尝试将字典转换为数组。尝试用Dictionary&lt;string, string&gt; 替换您的string[]

    【讨论】:

    • @Robert Dondo 是否意味着 Error 对象可能有不同的字段,或者 JSON 中的 Errors 字段中可能有更多 Error 对象?
    • Error 对象可能有额外(或更少)的字段。当我发布初始帖子时,我没有考虑到这一点。
    • 好吧,那么这是满足您需要的更好答案:-)
    【解决方案2】:

    Errors 不是一个字符串数组,它是一个object,其属性为UserNameEmailAddress

    {
        "Success":false,
        "Errors":{
            "UserName":"User Name already registered",
            "EmailAddress":"Email Address already registered"
         }
    }
    

    好吧,你可以创建另一个类来存储错误消息

    public CustomJsonError
    {
        public string UserName { get; set; }
        public string EmailAddress { get; set; }
    }
    

    然后重构类

    public class CustomJsonResult
    {
        public bool Success { get; set; }
        public CustomJsonError Errors { get; set; } // I'm not sure if the property should be named as Errors
    }
    

    顺便说一句,错误会包含错误的数组/列表吗?

    更新

    好吧,您可以使用Dictionary&lt;string, string&gt;(请参阅其他答案)或为错误创建一个自定义类。请参阅http://james.newtonking.com/projects/json/help/SerializingCollections.html 以将 Collection 序列化和反序列化到 JSON 和从 JSON 中提取。

    【讨论】:

      【解决方案3】:

      那是因为您的 JSON 中的“错误”与它试图反序列化的内容不匹配。应该是这样的:

      public class CustomJsonResult
      {
          public bool Success { get; set; }
          public ErrorType[] Errors { get; set; }
      }
      
      public class ErrorType
      {
           public string UserName {get;set;}
           public string EmailAddress {get;set;}
      }
      

      如果你想改变 JSON 来匹配,它应该看起来像这样:

      {"Success":false, "Errors": ["User Name already registered", "Email Address already registered"]}
      

      否则你可能需要一些中间映射。

      【讨论】:

        【解决方案4】:

        使用标准 .NET 框架库 System.Web.Extensions 中的 JavaScriptSerializer:

        using System;
        using System.Collections.Generic;
        using System.Web.Script.Serialization;
        
        namespace ConsoleApplication1
        {
            class Program
            {
                static void Main(string[] args)
                {
                    var dict = new JavaScriptSerializer().Deserialize<Dictionary<string,int>>("{ a: 1, b: 2 }");
                    Console.WriteLine(dict["a"]);
                    Console.WriteLine(dict["b"]);
                    Console.ReadLine();
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-05-30
          • 2019-02-02
          • 1970-01-01
          • 2022-12-20
          • 2015-06-01
          • 2014-06-27
          相关资源
          最近更新 更多