【问题标题】:json.deserialize returns null + xamarin.formsjson.deserialize 返回 null + xamarin.forms
【发布时间】:2018-10-12 12:32:33
【问题描述】:

我从 web api 调用中得到这样的响应文本

{
    "response":{"numFound":4661,"start":0,"maxScore":6.3040514,"docs":[..]  }
}

我正在尝试像这样反序列化它

var result = JsonConvert.DeserializeObject<RootObject>(responseBodyAsText);

这是我的 c# 类:

public class Doc
{
public string id { get; set; }
public string journal { get; set; }
public string eissn { get; set; }
public DateTime publication_date { get; set; }
public string article_type { get; set; }
public List<string> author_display { get; set; }
public List<string> @abstract { get; set; }
public string title_display { get; set; }
public double score { get; set; }
}


 public class Response
{
public int numFound { get; set; }
public int start { get; set; }
public double maxScore { get; set; }
public List<Doc> docs { get; set; }
}


public class RootObject
{
public Response response { get; set; }
}

完整的源代码:

namespace CrossSampleApp1.Common
{
public class ServiceManager<T>
{
    public delegate void SucessEventHandler(T responseData, bool 
      HasMoreRecords = false);
    public delegate void ErrorEventHandler(ErrorData responseData);

    public event SucessEventHandler OnSuccess;
    public event ErrorEventHandler OnError;

    public async Task JsonWebRequest(string url, string contents, HttpMethod methodType, string mediaStream = "application/json")
    {
        bool isSuccessRequest = true;
        string responseBodyAsText = string.Empty;
        try
        {

            HttpClientHandler handler = new HttpClientHandler();
            using (HttpClient httpClient = new HttpClient(handler))
            {
                HttpRequestMessage message = new HttpRequestMessage(methodType, url);
                if (methodType == HttpMethod.Post)
                {
                    message.Headers.ExpectContinue = false;
                    message.Content = new StringContent(contents);
                    message.Content.Headers.ContentLength = contents.Length;
                    message.Content.Headers.ContentType = new MediaTypeHeaderValue(mediaStream);
                }

                httpClient.Timeout = new TimeSpan(0, 0, 10, 0, 0);
                HttpResponseMessage response = await httpClient.SendAsync(message);
                response.EnsureSuccessStatusCode();

                responseBodyAsText = response.Content.ReadAsStringAsync().Result;
            }
        }
        catch (HttpRequestException hre)
        {
            //responseBodyAsText = "Exception : " + hre.Message;
            responseBodyAsText = "Can't Connect (Please check your network connection)";
            isSuccessRequest = false;
        }
        catch (Exception ex)
        {
            //  responseBodyAsText = "Exception : " + ex.Message;
            responseBodyAsText = "Can't Connect (Please check your network connection)";
            isSuccessRequest = false;
        }

        try
        {
            if (isSuccessRequest)
            {
                if (typeof(T) == typeof(string))
                {
                    OnSuccess?.Invoke((T)(object)responseBodyAsText);
                }
                else if (typeof(T) == typeof(ServiceResponse))
                {
                    T result = JsonConvert.DeserializeObject<T>(responseBodyAsText);
                    OnSuccess?.Invoke(result);
                }
                else
                {
                    var result = JsonConvert.DeserializeObject<RootObject>(responseBodyAsText);
                    var data = JsonConvert.DeserializeObject<T>(Convert.ToString(result));
                    OnSuccess?.Invoke(data);

                }
            }
            else
            {
                OnError?.Invoke(new ErrorData
                {
                    ErrorText = responseBodyAsText
                });

            }
        }
        catch (Exception e)
        {
            OnError?.Invoke(new ErrorData
            {
                ErrorText = e.Message
            });
        }
    }

}

public class ErrorData : EventArgs
{
    public string ErrorText { get; set; }
    public bool Status { get; set; }
}

}

但我在结果中得到空值。任何人都可以帮忙。我做错了什么

谢谢。

【问题讨论】:

  • 您实际上是否在某处反序列化为 RootObject 类型?还是您尝试使用as 投射它?
  • 请提供一个minimal reproducible example,因为给定的代码给了我一个非空的result 值,这与你所说的相反。
  • 仅供参考,您实际上并没有使用您提到的类,因为您使用的是.DeserializeObject 的非通用版本,这意味着您将获得@987654331 @。如果您稍后拥有result as RootObject,那么是的,您将获得null。然而,这就是为什么我们需要minimal reproducible example,以便确切地了解您在做什么。
  • @Neelam 最好不要将您的代码作为引号。
  • var data = JsonConvert.DeserializeObject&lt;T&gt;(Convert.ToString(result)); 呃,除非RootObjectToString() 方法被重载以返回一个JSON 对象,那么Convert.ToString() 不会按照您的想法做。 Convert.ToString(instanceOfRootObject) 将返回“CrossSampleApp1.Common.RootObject”(如果 RootObject 在“CrossSampleApp1.Common”命名空间中)

标签: c# xamarin xamarin.forms json.net deserialization


【解决方案1】:

这不起作用:

var result = JsonConvert.DeserializeObject<RootObject>(responseBodyAsText);
var data = JsonConvert.DeserializeObject<T>(Convert.ToString(result));
OnSuccess?.Invoke(data);

您将string responseBodyAsString 反序列化为RootObject 类型的对象。之后,您将对象转换为字符串并尝试将此字符串(无论它可能包含什么)反序列化为 T。

我猜result.response 应该是你的数据。

我不确定你的问题是什么。也许您忘记命名要反序列化的类型。

这里有一些反序列化的例子:

static void Main(string[] args)
{
    // Example-data
    string jsonInput = "{ \"response\":{\"numFound\":4661,\"start\":0,\"maxScore\":6.3040514,\"docs\":[\"a\",\"b\"] } }";
    // deserialize the inputData to out class "RootObject"
    RootObject r = JsonConvert.DeserializeObject<RootObject>(jsonInput);

    // Let's see if we got something in our object:
    Console.WriteLine("NumFound: " + r.response.numFound);
    Console.WriteLine("Start: " + r.response.start);
    Console.WriteLine("MaxScrote: " + r.response.maxScore);
    Console.WriteLine("Docs: " + string.Join(", ", r.response.docs));

    Console.WriteLine("-- let's have a look to our Deserializer without giving a type --");

    object o = JsonConvert.DeserializeObject("{ \"response\":{\"numFound\":4661,\"start\":0,\"maxScore\":6.3040514,\"docs\":[\"a\",\"b\"] } }");
    Console.WriteLine("Type: " + o.GetType());
    JObject j = o as JObject;
    Console.WriteLine(j["response"]);
    Console.WriteLine("NumFound: " + j["response"]["numFound"]);
    Console.WriteLine("Start: " + j["response"]["start"]);
    Console.WriteLine("MaxScrote: " + j["response"]["maxScore"]);
    Console.WriteLine("Docs: " + String.Join(", ", j["response"]["docs"].Select(s => s.ToString())));
}

public class Response
{
    public int numFound { get; set; }
    public int start { get; set; }
    public double maxScore { get; set; }
    public List<string> docs { get; set; }
}

public class RootObject
{
    public Response response { get; set; }
}

【讨论】:

  • 感谢您的好评,但我尝试了相同的 RootObject r = JsonConvert.DeserializeObject(jsonInput);
  • 但在帖子中我不知道为什么它没有像那样反映
  • 反序列化与你的 http-action 无关。也许您的输入数据不正确?扩展了正在运行的示例。
  • 抱歉没听懂你想说什么
  • 发布您的源代码,我们会找到您的问题。您发布的 sn-ps 是正确的。我的示例使用您的 sn-ps 并且可以工作。
猜你喜欢
  • 2017-08-08
  • 2023-03-20
  • 2021-07-09
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多