【问题标题】:Convert JSON String To C# Object将 JSON 字符串转换为 C# 对象
【发布时间】:2022-01-01 19:26:01
【问题描述】:

尝试将 JSON 字符串转换为 C# 中的对象。使用一个非常简单的测试用例:

JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");

问题是 routes_list 永远不会被设置;这是一个未定义的对象。有什么想法吗?

【问题讨论】:

  • @Greg:我实际上推荐JavaScriptSerializer而不是MS的版本,因为它除了WCF的自定义JSON格式之外不接受任何其他内容(例如,日期字段看起来像日期但不包含在DATE中( ) 惨败)
  • 另外,看看这篇Parsing JSON objects with JavascriptSerializer in .NET的文章,其实是一个很棒的教程。
  • 您从哪里获得 JavaScriptSerializer?它在我的 C# .NET 3.5 项目中无法识别。
  • @B. Clay Shannon 这为我解决了stackoverflow.com/questions/7000811/…
  • 您可以毫无问题地使用JavaScriptSerializer 。我将在下面提供答案。

标签: c# json


【解决方案1】:

或者,您可以使用 Newtownsoft.Json 库,如下所示:

using Newtonsoft.Json;
...
var result = JsonConvert.DeserializeObject<T>(json);

T 是与 JSON 字符串匹配的对象类型。

【讨论】:

  • 这很简单,我想了很长时间。
  • 您最终创建的“T”类型类可以是部分的,不需要是包含每个 JSON 属性的完整响应的精确副本。尽管层次结构需要匹配,但您可以准确地反序列化您需要的内容。
【解决方案2】:

看起来您正试图反序列化为原始对象。您可以创建一个代表您要转换为的对象的类。这在您处理较大的对象或 JSON 字符串的情况下非常有用。

例如:

  class Test {

      String test; 

      String getTest() { return test; }
      void setTest(String test) { this.test = test; }

  }

那么您的反序列化代码将是:

   JavaScriptSerializer json_serializer = new JavaScriptSerializer();
   Test routes_list = 
          (Test)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");

可以在本教程中找到更多信息: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx

【讨论】:

  • 但在有针对性的文章中使用了自动属性。也值得一提。
  • 抱歉,此代码示例不起作用。 DeserializeObject 给出了一个例外。使用 var routes_list = serializer.Deserialize("{\"test\":\"some data\"}");反而。此外,您不需要 get/setTest(),并且字符串测试应该是公开的。这看起来更像 java 而不是 C#。
  • 正如 Dan Vallejo 所说,这是一个不正确的解决方案。毕竟 setTest(String test) 没有返回,这也是编译错误。
  • 也可以这样用:json_serializer.Deserialize("{ \"test\":\"some data\" }"); //而不是(测试)json_serializer.....
  • 如果你不确定你的类对象的格式,试试这个link。它将您的 Json 字符串转换为正确的类。为我节省了大量时间!
【解决方案3】:

您可能不想只将 routes_list 声明为 object 类型。它没有 .test 属性,所以你真的不会得到一个好的对象。这是您最好定义类或结构或使用动态关键字的地方之一。

如果您真的希望此代码按您的方式工作,您需要知道 DeserializeObject 返回的对象是字符串、对象的通用字典。这是这样做的代码:

var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);

如果你想使用动态关键字,you can read how here

如果你声明一个类或结构,你可以像这样调用 Deserialize 而不是 DeserializeObject:

class MyProgram {
    struct MyObj {
        public string test { get; set; }
    }

    static void Main(string[] args) {
        var json_serializer = new JavaScriptSerializer();
        MyObj routes_list = json_serializer.Deserialize<MyObj>("{ \"test\":\"some data\" }");
        Console.WriteLine(routes_list.test);

        Console.WriteLine("Done...");
        Console.ReadKey(true);
    }
}

【讨论】:

  • 做:json_serializer = new JavaScriptSerializer(); object routes_list = (IDictionary)json_serializer.DeserializeObject("{ \"test\":\"some data here\" }");在当前上下文中仍然不存在“routes_list”。
  • 不要使用object routes_list。使用 var 或明确重复自己并将 routes_list 声明为 IDictionary.
【解决方案4】:

在 JavaScriptSerializer 中使用动态对象。

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
dynamic item = serializer.Deserialize<object>("{ \"test\":\"some data\" }");
string test= item["test"];

//test Result = "some data"

【讨论】:

    【解决方案5】:

    Newtonsoft 比 java 脚本序列化器更快。 ...这个依赖于 Newtonsoft NuGet 包,它比默认的序列化程序更受欢迎并且更好。

    一行代码解决方案。

    var myclass = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(Jsonstring);
    
    Myclass oMyclass = Newtonsoft.Json.JsonConvert.DeserializeObject<Myclass>(Jsonstring);
    

    【讨论】:

      【解决方案6】:

      您可以使用 Newtonsoft.Json 库轻松完成您的要求。我正在写下面的一个例子,看看它。

      您收到的对象类型的类:

      public class User
      {
          public int ID { get; set; }
          public string Name { get; set; }
      
      }
      

      代码:

      static void Main(string[] args)
      {
      
            string json = "{\"ID\": 1, \"Name\": \"Abdullah\"}";
      
            User user = JsonConvert.DeserializeObject<User>(json);
      
            Console.ReadKey();
      }
      

      这是解析 json 的一种非常简单的方法。

      【讨论】:

        【解决方案7】:

        这是一个简单的课程,我从不同的帖子中拼凑起来......它已经测试了大约 15 分钟,但 似乎 可以满足我的目的。它使用JavascriptSerializer 来完成这项工作,可以使用详细信息in this post 在您的应用中引用。

        以下代码可以在 LinqPad 中运行以通过以下方式进行测试:

        • 右键单击 LinqPad 中的脚本选项卡,然后选择“查询 属性”
        • 在“其他引用”中引用“System.Web.Extensions.dll”
        • 添加“附加命名空间导入” “System.Web.Script.Serialization”。

        希望对你有帮助!

        void Main()
        {
          string json = @"
          {
            'glossary': 
            {
              'title': 'example glossary',
                'GlossDiv': 
                {
                  'title': 'S',
                  'GlossList': 
                  {
                    'GlossEntry': 
                    {
                      'ID': 'SGML',
                      'ItemNumber': 2,          
                      'SortAs': 'SGML',
                      'GlossTerm': 'Standard Generalized Markup Language',
                      'Acronym': 'SGML',
                      'Abbrev': 'ISO 8879:1986',
                      'GlossDef': 
                      {
                        'para': 'A meta-markup language, used to create markup languages such as DocBook.',
                        'GlossSeeAlso': ['GML', 'XML']
                      },
                      'GlossSee': 'markup'
                    }
                  }
                }
            }
          }
        
          ";
        
          var d = new JsonDeserializer(json);
          d.GetString("glossary.title").Dump();
          d.GetString("glossary.GlossDiv.title").Dump();  
          d.GetString("glossary.GlossDiv.GlossList.GlossEntry.ID").Dump();  
          d.GetInt("glossary.GlossDiv.GlossList.GlossEntry.ItemNumber").Dump();    
          d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef").Dump();   
          d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso").Dump(); 
          d.GetObject("Some Path That Doesnt Exist.Or.Another").Dump();   
        }
        
        
        // Define other methods and classes here
        
        public class JsonDeserializer
        {
          private IDictionary<string, object> jsonData { get; set; }
        
          public JsonDeserializer(string json)
          {
            var json_serializer = new JavaScriptSerializer();
        
            jsonData = (IDictionary<string, object>)json_serializer.DeserializeObject(json);
          }
        
          public string GetString(string path)
          {
            return (string) GetObject(path);
          }
        
          public int? GetInt(string path)
          {
            int? result = null;
        
            object o = GetObject(path);
            if (o == null)
            {
              return result;
            }
        
            if (o is string)
            {
              result = Int32.Parse((string)o);
            }
            else
            {
              result = (Int32) o;
            }
        
            return result;
          }
        
          public object GetObject(string path)
          {
            object result = null;
        
            var curr = jsonData;
            var paths = path.Split('.');
            var pathCount = paths.Count();
        
            try
            {
              for (int i = 0; i < pathCount; i++)
              {
                var key = paths[i];
                if (i == (pathCount - 1))
                {
                  result = curr[key];
                }
                else
                {
                  curr = (IDictionary<string, object>)curr[key];
                }
              }
            }
            catch
            {
              // Probably means an invalid path (ie object doesn't exist)
            }
        
            return result;
          }
        }
        

        【讨论】:

          【解决方案8】:

          正如tripletdad99所说的

          var result = JsonConvert.DeserializeObject<T>(json);
          

          但如果您不想创建额外的对象,您可以使用 Dictionary 代替

          var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(json_serializer);
          

          【讨论】:

          • 这很有用,然后你将参数传递给 Url.Action(action,controller,result)
          【解决方案9】:

          添加此 ddl 以引用您的项目:System.Web.Extensions.dll

          使用这个命名空间:using System.Web.Script.Serialization;

          public class IdName
          {
              public int Id { get; set; }
              public string Name { get; set; }
          }
          
          
             string jsonStringSingle = "{'Id': 1, 'Name':'Thulasi Ram.S'}".Replace("'", "\"");
             var entity = new JavaScriptSerializer().Deserialize<IdName>(jsonStringSingle);
          
             string jsonStringCollection = "[{'Id': 2, 'Name':'Thulasi Ram.S'},{'Id': 2, 'Name':'Raja Ram.S'},{'Id': 3, 'Name':'Ram.S'}]".Replace("'", "\"");
             var collection = new JavaScriptSerializer().Deserialize<IEnumerable<IdName>>(jsonStringCollection);
          

          【讨论】:

            【解决方案10】:

            复制您的 Json 并粘贴到 json2csharp 的文本框中,然后单击“生成”按钮。

            一个 cs 类将使用该 cs 文件生成如下

            var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);
            

            其中RootObject是生成的cs文件的名称;

            【讨论】:

              【解决方案11】:

              半自动化这些步骤的另一种快速简便的方法是:

              1. 获取您要解析的 JSON 并将其粘贴到此处:https://app.quicktype.io/。在下拉菜单中将语言更改为 C#。
              2. 将左上角的名称更新为您的班级名称,默认为“欢迎”。
              3. 在 Visual Studio 中,转到网站 -> 管理包并使用 NuGet 从 Newtonsoft 添加 Json.Net。
              4. app.quicktype.io 基于 Newtonsoft 生成的序列化方法。 或者,您现在可以使用如下代码:

                WebClient 客户端 = new WebClient();

                string myJSON = client.DownloadString("https://URL_FOR_JSON.com/JSON_STUFF");

                var myClass = Newtonsoft.Json.JsonConvert.DeserializeObject(myJSON);

              【讨论】:

              • 链接不再有效
              • 感谢 Myles J,我更新到了一个似乎可以正常工作的新网站。
              【解决方案12】:

              在 C# 中将 JSON 字符串转换为对象。使用下面的测试用例..它对我有用。这里的“MenuInfo”是我的 C# 类对象。

              JsonTextReader reader = null;
              try
              {
                  WebClient webClient = new WebClient();
                  JObject result = JObject.Parse(webClient.DownloadString("YOUR URL"));
                  reader = new JsonTextReader(new System.IO.StringReader(result.ToString()));
                  reader.SupportMultipleContent = true;
              }
              catch(Exception)
              {}
              
              JsonSerializer serializer = new JsonSerializer();
              MenuInfo menuInfo = serializer.Deserialize<MenuInfo>(reader);
              

              【讨论】:

              • 需要 Newtonsoft.Json.dll / 参考,同意吗?
              【解决方案13】:

              首先你必须包含如下库:

              using System.Runtime.Serialization.Json;
              
              DataContractJsonSerializer desc = new DataContractJsonSerializer(typeof(BlogSite));
              string json = "{\"Description\":\"Share knowledge\",\"Name\":\"zahid\"}";
              
              using (var ms = new MemoryStream(ASCIIEncoding.ASCII.GetBytes(json)))
              {
                  BlogSite b = (BlogSite)desc.ReadObject(ms);
                  Console.WriteLine(b.Name);
                  Console.WriteLine(b.Description);
              }
              

              【讨论】:

                【解决方案14】:

                假设你有一个类名Student,它有以下字段,它有一个方法可以将 JSON 作为输入并返回一个字符串Student Object。我们可以在这里使用JavaScriptSerializer Convert JSON String To C# Object .std 在这里是一个 JSON 字符串。

                  public class Student
                {
                   public string FirstName {get;set:}
                   public string LastName {get;set:}
                   public int[] Grades {get;set:}
                }
                
                public static Student ConvertToStudent(string std)
                {
                  var serializer = new JavaScriptSerializer();
                
                  Return serializer.Deserialize<Student>(std);
                 }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-08-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-08-27
                  • 2020-05-27
                  • 1970-01-01
                  相关资源
                  最近更新 更多