将JSON转换为C#数组?

36

有没有人知道如何将包含JSON的字符串转换为C#数组。我有一个从WebBrowser中读取文本/ JSON并将其存储到字符串中的代码。

string docText = webBrowser1.Document.Body.InnerText;

只需要将该 JSON 字符串转换成数组即可。一直在看 Json.NET,但不确定是否需要它,因为我不想将数组转换成 JSON,而是想实现反向操作。感谢您的帮助!


你的字符串不一定要是一个数组,它也可以是一个哈希表。那么这个数组是什么?你的字符串长什么样子,你想得到什么结果?你试图实现什么目标? - Tomas Jansson
可能是在C#中解析JSON的重复问题 - Oskar Kjellin
5个回答

69

只需取出字符串并使用JavaScriptSerializer将其反序列化为本地对象。例如,有以下JSON:

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

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

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);

这里有一个JavaScriptSerializer文档链接.

注意:我上面的代码未经测试,但这是个想法已经测试过了。除非你在做一些“奇特”的事情,否则你应该可以使用JavaScriptSerializer。


谢谢!你知道JavascriptSerializer使用哪个命名空间吗?我得到了“找不到”的错误。 - Joey Morani
1
是的,它在我链接的文档中。它在System.Web.Script.Serialization中。你需要添加对System.Web.Extensions程序集的引用。 - Icarus
啊,谢谢。搞定了。我想是 'JavaScriptSerializer' 而不是 'JavascriptSerializer'。所以才会出现那个错误。你可能想要修改一下。 :) - Joey Morani
@JoeyMorani 很抱歉,我会进行编辑。当我在本地测试时,VS已经为我纠正了它,所以我没有意识到这个问题。:S - Icarus
感谢提供如此简单的解决方案,本应该是一个简单问题的事情,结果却变得那么简单。其他解决方案似乎都需要写上几十行代码,我却无法让它们起作用。 - Alan M

11
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; }
}

在HttpContent部分,当您使用GET请求请求数据时,例如:
HttpContent content = response.Content;
string mycontent = await content.ReadAsStringAsync();
//deserialization in items
ToDoItem[] items = JsonConvert.DeserializeObject<ToDoItem[]>(mycontent);

7

是的,你需要使用Json.Net。基本上,你想要将一个Json字符串反序列化为一个对象数组。

请参考他们的示例

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);

5

这是一个比较老的问题,但如果您使用.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; }
        }
    }
}

2

其他回答中没有涵盖的一种情况是当您不知道JSON对象包含的类型时。这正是我的情况,因为我需要能够不对其进行类型定义并使其保持动态。

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

注意:最好有类型,但在某些情况下可能不可能,这就是我添加此答案的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接