如何使用C#将JSON文本转换为对象

38

如何将以下 JSON 响应转换为 C# 对象?

{ 
    "err_code": "0", 
    "org": "CGK", 
    "des": "SIN", 
    "flight_date": "20120719",
    "schedule": [
        ["W2-888","20120719","20120719","1200","1600","03h00m","737-200","0",[["K","9"],["F","9"],["L","9"],["M","9"],["N","9"],["P","9"],["C","9"],["O","9"]]],
        ["W2-999","20120719","20120719","1800","2000","01h00m","MD-83","0",[["K","9"],["L","9"],["M","9"],["N","9"]]]
    ]
}

如果您正在使用MVC,它会自动提供很多支持转换的功能。您还可以查看此链接:http://msdn.microsoft.com/en-us/library/bb410770.aspx - Glenn Ferrie
1
请查看此帖子:https://dev59.com/uGw15IYBdhLWcg3wbbJx - Jocke
1
我遇到了一个问题,无法为该JSON响应构建类,有人能为该JSON响应构建类吗? - Vishwajeet
可能是 如何使用 C# 解析 JSON? 的重复问题。 - StayOnTarget
6个回答

133
  1. 要从json字符串创建一个类,请复制该字符串。

  2. 在Visual Studio中,点击顶部菜单中的“编辑”>“特殊粘贴”>“将Json粘贴为类”

  3. 通过Nuget安装Newtonsoft.Json

  4. 将以下代码粘贴到您的项目中,“jsonString”是您想要反序列化的变量:

    Rootobject r = Newtonsoft.Json.JsonConvert.DeserializeObject<Rootobject>(jsonString);

  5. 不要忘记将Rootobject重命名为更具描述性的名称,例如ILoveTheSmellOfNapalmInTheMorning-这只是个玩笑


17
真是惊人,每个人都跳过了这个回答。已点赞。 - Robert Oschler
3
是的,我认为这确实是当时所要求的。在VS2012中这有点绕弯子(参见此处:https://dev59.com/imMl5IYBdhLWcg3wR1WD),但现在在VS2017中,非常直截了当。 - Ben Butzer
2
非常有用,当使用JsonConvert进行转换时,您可能需要将委托创建为数组。在我的情况下,这就是我必须做的,以便将JSON字符串转换为类。JsonConvert.DeserializeObject <PanelFootnotes []>(FootnoteJSON.Value) - Brandon
1
我认为这不是所要求的。 - KansaiRobot
2
这不适用于大小大于5 MB的JSON文件。 - Ali Hassan
显示剩余2条评论

64

首先创建一个类来表示你的JSON数据。

public class MyFlightDto
{
    public string err_code { get; set; }
    public string org { get; set; } 
    public string flight_date { get; set; }
    // Fill the missing properties for your data
}

使用Newtonsoft JSON序列化程序将json字符串反序列化为其对应的类对象。了解更多

var jsonInput = "{ org:'myOrg',des:'hello'}"; 
MyFlightDto flight = Newtonsoft.Json.JsonConvert.DeserializeObject<MyFlightDto>(jsonInput);

或者使用 JavaScriptSerializer 将其转换为类(不建议,因为Newtonsoft JSON序列化器似乎表现更好)。

string jsonInput="have your valid json input here"; //
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
Customer objCustomer  = jsonSerializer.Deserialize<Customer >(jsonInput)

假设你想要将它转换为一个Customer类的实例。你的类应该类似于JSON结构(属性)。


1
我无法为该JSON响应构建类。 - Vishwajeet
@shyju - 太棒了。非常简单和直观。 - Gaurav Shah

58
我建议你使用JSON.NET。它是一个开源库,可以将你的C#对象序列化和反序列化为JSON,并将JSON对象转换为.NET对象。
以下是他们网站上的一些内容: 反序列化示例:
string json = @"{
  'Name': 'Bad Boys',
  'ReleaseDate': '1995-4-7T00:00:00',
  'Genres': [
    'Action',
    'Comedy'
  ]
}";

Movie m = JsonConvert.DeserializeObject<Movie>(json);

string name = m.Name;
// Bad Boys

性能比较与其他JSON序列化技术 enter image description here

1
嗨,Talha,我的问题是我无法构建一个包含此 JSON 结果的类的数据结构。 - Vishwajeet
1
@Vish:你应该有一个主类,例如FlightInfo,它具有属性,其中一个属性应该是Schedule的列表,例如List<Schedule>。 Schedule是第二个类,它也有一些属性。请仔细查看您的JSON字符串。 - Talha
@Talha:是的,但是日程表包含哪些类型的属性,因为在日程表中有数组嵌套数组。 - Vishwajeet
这并没有回答问题。 - Ole EH Dufour

5

复制您的Json并粘贴到http://json2csharp.com/上的文本框中,然后单击生成按钮。

将生成一个C#类文件,使用该cs文件如下:

var generatedcsResponce = JsonConvert.DeserializeObject<RootObject>(yourJson);

RootObject 是生成的 C# 文件的名称。


太好了,又发现一个类似的有用在线工具,可能会有所帮助,这是链接: https://www.minify-beautify.com/json-to-csharp-class-online/ - Vikas Lalwani

2
这将把一个 JSON 字符串转换为您指定的任何类。
public static T ConvertJsonToClass<T>(this string json)
    {
        System.Web.Script.Serialization.JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        return serializer.Deserialize<T>(json);
    }

1
class Program
{
    static void Main(string[] args)
    {
        var res = Json; //Json that has to be converted

        Response resp = new Response();
        resp = JsonSerializer.Deserialize<Response>(res);

        Console.WriteLine(res);
    }
}

public class Response
{
    public bool isValidUser { get; set; }
    public string message { get; set; }
    public int resultKey { get; set; }
}

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