json.deserialize возвращает null + xamarin.forms

я получаю текст ответа, подобный этому, от вызова веб-API

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

я пытаюсь десериализовать это так

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

это мой класс С#:

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

}

но я получаю нулевое значение в результате. может ли кто-нибудь помочь. что я делаю неправильно

благодарю вас.


person Neelam Prajapati    schedule 02.05.2018    source источник
comment
Вы действительно где-то десериализуете тип RootObject? Или вы пытаетесь разыграть его с помощью as?   -  person Llama    schedule 02.05.2018
comment
Предоставьте минимальный воспроизводимый пример, так как данный код дает мне ненулевое значение result, в отличие от того, что вы говорят, что это так.   -  person Lasse V. Karlsen    schedule 02.05.2018
comment
Просто к вашему сведению, вы на самом деле не используете классы, о которых вы упомянули, поскольку вы используете неуниверсальную версию .DeserializeObject, что означает, что вы получите обратно JObject. Если позже у вас будет result as RootObject, то да, вы получите null. Однако именно поэтому нам нужен минимально воспроизводимый пример, чтобы увидеть, точно что ты делаешь.   -  person Lasse V. Karlsen    schedule 02.05.2018
comment
о боже, я не ошибаюсь с этим сайтом. я разместил var result = JsonConvert.DeserializeObject‹RootObject›(responseBodyAsText); все же это не отражает то же самое   -  person Neelam Prajapati    schedule 02.05.2018
comment
даже отредактировать не могу.   -  person Neelam Prajapati    schedule 02.05.2018
comment
@Neelam Лучше не указывать свой код в качестве цитаты.   -  person Llama    schedule 02.05.2018
comment
@john oh..y это создало проблему.спасибо, что уведомили меня..пожалуйста, проверьте редактирование   -  person Neelam Prajapati    schedule 02.05.2018
comment
Можете ли вы предоставить минимально воспроизводимый пример? Ваш код работает нормально.   -  person Llama    schedule 02.05.2018
comment
я пытался сделать его минимальным и максимально простым..   -  person Neelam Prajapati    schedule 02.05.2018
comment
@Neelam Недостающая часть, которую можно проверить. Ваш пример не воспроизводит вашу проблему.   -  person Llama    schedule 02.05.2018
comment
пожалуйста, проверьте редактирование. я обновил полный исходный код .. я что-то упускаю или делаю что-то не так?   -  person Neelam Prajapati    schedule 02.05.2018
comment
var data = JsonConvert.DeserializeObject<T>(Convert.ToString(result)); Ухх, если только метод ToString() RootObject не перегружен для возврата объекта JSON, тогда Convert.ToString() не делает того, что вы думаете. Convert.ToString(instanceOfRootObject) вернет CrossSampleApp1.Common.RootObject (если RootObject находится в пространстве имен CrossSampleApp1.Common)   -  person Llama    schedule 02.05.2018
comment
но я не получаю значения даже в приведенной выше строке кода. Проблема с десерилизацией. поэтому должна быть там, я думаю   -  person Neelam Prajapati    schedule 02.05.2018
comment
Тогда ваша входная строка неверна.   -  person Llama    schedule 02.05.2018
comment
Вы хотите сказать responseBodyAsText? но это то же самое, что я получил от вызова веб-API   -  person Neelam Prajapati    schedule 02.05.2018
comment
Что-то не так ???? Извините   -  person Llama    schedule 02.05.2018
comment
Используете ли вы живой проигрыватель Xamarin Forms? Если это так, то, по-видимому, это не работает с Json.NET из-за отсутствия поддержки отражения. См. JsonConvert.SerializeObject всегда возвращает {} в XamarinForms и developer.xamarin.com/guides/cross-platform/live/limitations   -  person dbc    schedule 03.05.2018
comment
См. также forums.xamarin.com/discussion /119749/   -  person dbc    schedule 03.05.2018


Ответы (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; }
}
person kara    schedule 02.05.2018
comment
спасибо за ваш ответ, но я пробовал тот же RootObject r = JsonConvert.DeserializeObject‹RootObject›(jsonInput); - person Neelam Prajapati; 02.05.2018
comment
но в посте я не знаю, почему это не отражается так - person Neelam Prajapati; 02.05.2018
comment
Десериализация не имеет ничего общего с вашим http-действием. Возможно, ваши вводные данные неверны? Расширенный пример, который работает. - person kara; 02.05.2018
comment
Извини, не понял, что ты пытаешься сказать - person Neelam Prajapati; 02.05.2018
comment
Разместите исходный код, и мы найдем вашу проблему. Фрагменты, которые вы разместили, верны. Мой пример использует ваши фрагменты и работает. - person kara; 02.05.2018
comment
я получаю текст ответа от вызова веб-API. но во время десериализации я получаю нуль в своем результате - person Neelam Prajapati; 02.05.2018
comment
@NeelamPrajapati Я не понимаю, что должен делать ваш код. Вы должны проверить это шаг за шагом. Добавлен комментарий к вашей десериализации к ответу. - person kara; 02.05.2018
comment
тип: Newtonsoft.Json.Linq.JObject - person Neelam Prajapati; 02.05.2018
comment
Это не имеет никакого смысла. Почему вы хотите сериализоваться в JObject?! - person kara; 02.05.2018
comment
Я пытаюсь сделать пример приложения для интеграции вызовов веб-API в xamarin.app. код ниже упоминается, что я взял из одного эталонного проекта. - person Neelam Prajapati; 02.05.2018
comment
поэтому я пытаюсь интегрировать это с моим веб-API. - person Neelam Prajapati; 02.05.2018