【问题标题】:Convert json to a C# array?将 json 转换为 C# 数组?
【发布时间】:2012-03-24 02:26:31
【问题描述】:

有谁知道如何将包含 json 的字符串转换为 C# 数组。我有这个从 webBrowser 读取 text/json 并将其存储到字符串中。

string docText = webBrowser1.Document.Body.InnerText;

只需要以某种方式将该 json 字符串更改为一个数组。一直在查看 Json.NET,但我不确定这是否是我需要的,因为我不想将数组更改为 json;但反过来。感谢您的帮助!

【问题讨论】:

  • 您的字符串不必是数组,也可以是散列。还有什么数组?你的字符串是什么样的,你希望结果是什么?你想达到什么目的。
  • Parse JSON in C# 的可能重复项

标签: c# arrays winforms json


【解决方案1】:

只需获取字符串并使用 JavaScriptSerializer 将其反序列化为原生对象。例如,有这个 json:

string json = "[{Name:'John Simith',Age:35},{Name:'Pablo Perez',Age:34}]"; 

您需要创建一个名为的 C# 类,例如,Person 定义如下:

public class Person
{
 public int Age {get;set;}
 public string Name {get;set;}
}

您现在可以通过执行以下操作将 JSON 字符串反序列化为 Person 数组:

JavaScriptSerializer js = new JavaScriptSerializer();
Person [] persons =  js.Deserialize<Person[]>(json);

这是link to JavaScriptSerializer documentation

注意:我上面的代码没有经过测试,但这就是想法 测试了它。除非您正在做一些“异国情调”的事情,否则使用 JavascriptSerializer 应该没问题。

【讨论】:

  • 谢谢!你知道 JavascriptSerializer 使用什么命名空间吗?收到“找不到”错误。
  • 是的,它在我链接的文档中。它在 System.Web.Script.Serialization 中。您需要添加对 System.Web.Extensions 程序集的引用。
  • 啊,谢谢。得到它的工作。认为它是“JavaScriptSerializer”而不是“JavascriptSerializer”。这就是我收到该错误的原因。您可能想要编辑它。 :)
  • @JoeyMorani 对此感到抱歉。我会编辑它。当然,当我在本地测试时,VS为我纠正了,我没有意识到。 :S
  • 感谢您提供了一个非常简单的解决方案来解决应该是并且结果是一个简单的问题。其他解决方案似乎烧掉了几十行代码,我无法让它们工作。
【解决方案2】:

是的,Json.Net 正是您所需要的。您基本上想将 Json 字符串反序列化为 objects 的数组。

their examples:

string myJsonString = @"{
  "Name": "Apple",
  "Expiry": "\/Date(1230375600000+1300)\/",
  "Price": 3.99,
  "Sizes": [
    "Small",
    "Medium",
    "Large"
  ]
}";

// Deserializes the string into a Product object
Product myProduct = JsonConvert.DeserializeObject<Product>(myJsonString);

【讨论】:

    【解决方案3】:
    using Newtonsoft.Json;
    

    在包控制台中安装这个类 此类在所有 .NET 版本中都可以正常工作,例如在我的项目中:我有 DNX 4.5.1 和 DNX CORE 5.0,一切正常。

    首先在JSON反序列化之前,需要声明一个类可以正常读取,并在某处存储一些数据 这是我的课:

    public class ToDoItem
    {
        public string text { get; set; }
        public string complete { get; set; }
        public string delete { get; set; }
        public string username { get; set; }
        public string user_password { get; set; }
        public string eventID { get; set; }
    }
    

    在通过 GET 请求请求数据的 HttpContent 部分 例如:

    HttpContent content = response.Content;
    string mycontent = await content.ReadAsStringAsync();
    //deserialization in items
    ToDoItem[] items = JsonConvert.DeserializeObject<ToDoItem[]>(mycontent);
    

    【讨论】:

      【解决方案4】:

      老问题,但如果使用 .NET Core 3.0 或更高版本,值得添加答案。 JSON序列化/反序列化内置在框架(System.Text.Json)中,因此您不必再使用第三方库。这是一个基于@Icarus 给出的最佳答案的示例

      using System;
      using System.Collections.Generic;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  var json = "[{\"Name\":\"John Smith\", \"Age\":35}, {\"Name\":\"Pablo Perez\", \"Age\":34}]";
      
                  // use the built in Json deserializer to convert the string to a list of Person objects
                  var people = System.Text.Json.JsonSerializer.Deserialize<List<Person>>(json);
      
                  foreach (var person in people)
                  {
                      Console.WriteLine(person.Name + " is " + person.Age + " years old.");
                  }
              }
      
              public class Person
              {
                  public int Age { get; set; }
                  public string Name { get; set; }
              }
          }
      }
      

      【讨论】:

        【解决方案5】:

        其他响应中未涵盖的一种情况是您不知道 JSON 对象包含的类型。这就是我的情况,因为我需要能够不输入并保持动态。

        var objectWithFields =  js.Deserialize<dynamic[]>(json);
        

        注意:绝对首选有一个类型,在某些情况下,这是不可能的,这就是我添加这个答案的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-10-15
          • 1970-01-01
          • 1970-01-01
          • 2016-12-05
          • 1970-01-01
          • 1970-01-01
          • 2014-05-26
          相关资源
          最近更新 更多