я получаю текст ответа, подобный этому, от вызова веб-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; }
}
}
но я получаю нулевое значение в результате. может ли кто-нибудь помочь. что я делаю неправильно
благодарю вас.
RootObject
? Или вы пытаетесь разыграть его с помощьюas
? - person Llama   schedule 02.05.2018result
, в отличие от того, что вы говорят, что это так. - person Lasse V. Karlsen   schedule 02.05.2018.DeserializeObject
, что означает, что вы получите обратноJObject
. Если позже у вас будетresult as RootObject
, то да, вы получитеnull
. Однако именно поэтому нам нужен минимально воспроизводимый пример, чтобы увидеть, точно что ты делаешь. - person Lasse V. Karlsen   schedule 02.05.2018var 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