C# 解析json对象

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10432647/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-09 13:50:41  来源:igfitidea点击:

Parsing json objects

c#.netjsonvisual-studio

提问by Gregor Menih

I'm having trouble understanding how to parse JSON string into c# objects with Visual .NET. The task is very easy, but I'm still lost... I get this string:

我无法理解如何使用 Visual .NET 将 JSON 字符串解析为 c# 对象。任务很简单,但我还是迷路了……我得到了这个字符串:

{"single_token":"842269070","username":"example123","version":1.1}

And this is the code where I try to desterilize:

这是我尝试消毒的代码:

namespace _SampleProject
{
    public partial class Downloader : Form
    {
        public Downloader(string url, bool showTags = false)
        {
            InitializeComponent();
            WebClient client = new WebClient();
            string jsonURL = "http://localhost/jev";   
            source = client.DownloadString(jsonURL);
            richTextBox1.Text = source;
            JavaScriptSerializer parser = new JavaScriptSerializer();
            parser.Deserialize<???>(source);
        }

I don't know what to put between the '<' and '>', and from what I've read online I have to create a new class for it..? Also, how do I get the output? An example would be helpful!

我不知道在 '<' 和 '>' 之间放什么,根据我在网上阅读的内容,我必须为它创建一个新类..?另外,我如何获得输出?一个例子会很有帮助!

采纳答案by jaryd

Create a new class that your JSON can be deserialized into such as:

创建一个可以将您的 JSON 反序列化为的新类,例如:

public class UserInfo
{
    public string single_token { get; set; }
    public string username { get; set; }
    public string version { get; set; }
}

public partial class Downloader : Form
{
    public Downloader(string url, bool showTags = false)
    {
        InitializeComponent();
        WebClient client = new WebClient();
        string jsonURL = "http://localhost/jev";
        source = client.DownloadString(jsonURL);
        richTextBox1.Text = source;
        JavaScriptSerializer parser = new JavaScriptSerializer();
        var info = parser.Deserialize<UserInfo>(source);

        // use deserialized info object
    }
}

回答by Jakub Konecki

Yes, you need a new class with properties that will match your JSON.

是的,您需要一个具有与您的 JSON 匹配的属性的新类。

MyNewClass result = parser.Deserialize<MyNewClass>(source);

回答by Eduardo Crimi

You need a Class that match with the JSON you are getting and it will return a new object of that class with the values populated.

您需要一个与您获得的 JSON 匹配的类,它将返回该类的一个新对象,其中填充了值。

回答by marko

If you're using .NET 4 - use the dynamic datatype.

如果您使用 .NET 4 - 使用动态数据类型。

http://msdn.microsoft.com/en-us/library/dd264736.aspx

http://msdn.microsoft.com/en-us/library/dd264736.aspx

string json = "{ single_token:'842269070', username: 'example123', version:1.1}";

     JavaScriptSerializer jss = new JavaScriptSerializer();

     dynamic obj = jss.Deserialize<dynamic>(json);

     Response.Write(obj["single_token"]);
     Response.Write(obj["username"]);
     Response.Write(obj["version"]); 

回答by svick

The usual way would be create a class (or a set of classes, for more complex JSON strings) that describes the object you want to deserialize and use that as the generic parameter.

通常的方法是创建一个类(或一组类,用于更复杂的 JSON 字符串)来描述要反序列化的对象并将其用作通用参数。

Another option is to deserialize the JSON into a Dictionary<string, object>:

另一种选择是将 JSON 反序列化为Dictionary<string, object>

parser.Deserialize<Dictionary<string, object>>(source);

This way, you can access the data, but I wouldn't suggest you to do this unless you have to.

这样,您就可以访问数据,但除非万不得已,否则我不建议您这样做。

回答by RackM

Following is the code..

以下是代码..

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);

        request = WebRequest.Create("https://myipaddress/api/admin/configuration/v1/conference/1/");

        request.Credentials = new NetworkCredential("admin", "admin123");
        // Create POST data and convert it to a byte array.
        request.Method = "GET";          

                // Set the ContentType property of the WebRequest.
        request.ContentType = "application/json; charset=utf-8";          


        WebResponse response = request.GetResponse();
        // Display the status.
        Console.WriteLine(((HttpWebResponse)response).StatusDescription);
        // Get the stream containing content returned by the server.
        dataStream = response.GetResponseStream();
        // Open the stream using a StreamReader for easy access.
        StreamReader reader = new StreamReader(dataStream);
        // Read the content.
        string responseFromServer = reader.ReadToEnd();
        JavaScriptSerializer js = new JavaScriptSerializer();
        var obj = js.Deserialize<dynamic>(responseFromServer);
        Label1.Text = obj["name"];
        // Display the content.
        Console.WriteLine(responseFromServer);
        // Clean up the streams.
        reader.Close();
        dataStream.Close();
        response.Close();

回答by LastTribunal

dynamic data = JObject.Parse(jsString);
var value= data["value"];