在C#中从服务器获取JSON响应

时间:2019-11-15 18:06:33

标签: c# json.net

当我发送请求时,服务器将发送如下响应:

{
    "id":"YWauEwCUIe",
    "name":"User 1",
    "status":"DONE"
}

为此,我正在使用以下代码:

var client = new RestClient(mServer);
var request = new RestRequest(Method.POST);
request.AddQueryParameter("action", "GET");
IRestResponse response = client.Execute(request);
string mResponse = response.Content;

mUser = new JObject();
mUser = JObject.Parse(mResponse); // Error Line
string mStatus = mUser["status"].ToString();
if (mStatus.Equals("DONE")
{
    MessageBox.Show("Status: DONE");
}
  

错误:Newtonsoft.Json.JsonReaderException:'从JsonReader读取JObject时出错。当前的JsonReader项不是对象:空。路径”,第1行,位置4。'

2 个答案:

答案 0 :(得分:0)

我的回答是null导致MySQL错误的原因,现在它已解决。

PHP代码:

<?php
    $Message['id'] = "YWauEwCUIe";
    $Message['name'] = "User 1";
    $Message['status'] = "DONE";
    echo json_encode($Message);
?>

,这将显示此result

{
    "id":"YWauEwCUIe",
    "name":"User 1",
    "status":"DONE"
}

C#代码将起作用:

var client = new RestClient(mServer);
var request = new RestRequest(Method.POST);
request.AddQueryParameter("action", "GET");
IRestResponse response = client.Execute(request);
string mResponse = response.Content;

mUser = new JObject();
mUser = JObject.Parse(mResponse);
string mStatus = mUser["status"].ToString();
if (mStatus.Equals("DONE")
{
    MessageBox.Show("Status: DONE");
}

答案 1 :(得分:-1)

我会使用非常受欢迎的NewtonSoft库:

采用从服务器获得的响应形状(假设JSON对象不变并且您具有所有字段),可以在此处生成响应类:https://app.quicktype.io/#l=cs&r=json2csharp

对我来说,它生成了以下代码:

    using System;
    using System.Collections.Generic;

    using System.Globalization;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Converters;

    public partial class Welcome
    {
        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("status")]
        public string Status { get; set; }
    }

    public partial class Welcome
    {
        public static Welcome FromJson(string json) => JsonConvert.DeserializeObject<Welcome>(json, QuickType.Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this Welcome self) => JsonConvert.SerializeObject(self, QuickType.Converter.Settings);
    }

    internal static class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
            Converters =
            {
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }

这是我的示例代码:

using System;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

namespace JsonParse
{
    public partial class Welcome
    {
        [JsonProperty("id")]
        public string Id { get; set; }

        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("status")]
        public string Status { get; set; }
    }

    public partial class Welcome
    {
        public static Welcome FromJson(string json) => JsonConvert.DeserializeObject<Welcome>(json, Converter.Settings);
    }

    public static class Serialize
    {
        public static string ToJson(this Welcome self) => JsonConvert.SerializeObject(self, Converter.Settings);
    }

    internal static class Converter
    {
        public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
            DateParseHandling = DateParseHandling.None,
            Converters =
            {
                new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
            },
        };
    }

    class Program
    {
        static void Main(string[] args)
        {

            var jsonPayload = "{\"id\":\"YWauEwCUIe\",\"name\":\"User 1\",\"status\":\"DONE\"}";
            var jsonAsObject = Newtonsoft.Json.JsonConvert.DeserializeObject<Welcome>(jsonPayload);
            Console.WriteLine($"{jsonAsObject.Id} {jsonAsObject.Name} {jsonAsObject.Status}");
            Console.ReadKey();
        }
    }
}