Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# json.deserialize返回null+;xamarin.forms_C#_Xamarin_Xamarin.forms_Json.net_Deserialization - Fatal编程技术网

C# json.deserialize返回null+;xamarin.forms

C# json.deserialize返回null+;xamarin.forms,c#,xamarin,xamarin.forms,json.net,deserialization,C#,Xamarin,Xamarin.forms,Json.net,Deserialization,我从web api调用中得到这样的响应文本 { "response":{"numFound":4661,"start":0,"maxScore":6.3040514,"docs":[..] } } 我正试图像这样反序列化它 var result = JsonConvert.DeserializeObject<RootObject>(responseBodyAsText); var result=JsonConvert.DeserializeObject(response

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

{
    "response":{"numFound":4661,"start":0,"maxScore":6.3040514,"docs":[..]  }
}
我正试图像这样反序列化它

var result = JsonConvert.DeserializeObject<RootObject>(responseBodyAsText);
var result=JsonConvert.DeserializeObject(responseBodyAsText);
这是我的c#类:

公共类文档
{
公共字符串id{get;set;}
公共字符串日志{get;set;}
公共字符串eissn{get;set;}
公共日期时间发布\u日期{get;set;}
公共字符串项目类型{get;set;}
公共列表作者_显示{get;set;}
公共列表@abstract{get;set;}
公共字符串标题_显示{get;set;}
公共双倍分数{get;set;}
}
公众课堂反应
{
public int numFound{get;set;}
public int start{get;set;}
公共双maxScore{get;set;}
公共列表文档{get;set;}
}
公共类根对象
{
公共响应{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; }
}
名称空间CrossSampleApp1.Common
{
公共类服务管理器
{
公共代表无效成功拒绝(T响应数据,布尔
HasMoreRecords=false);
公共委托无效ErrorEventHandler(ErrorData responseData);
公共活动成功举办;
公共事件ErrorEventHandler OnError;
公共异步任务JsonWebRequest(字符串url、字符串内容、HttpMethod方法类型、字符串mediaStream=“application/json”)
{
bool issccessrequest=true;
string responseBodyAsText=string.Empty;
尝试
{
HttpClientHandler handler=新的HttpClientHandler();
使用(HttpClient HttpClient=新HttpClient(处理程序))
{
HttpRequestMessage=新的HttpRequestMessage(方法类型,url);
if(methodType==HttpMethod.Post)
{
message.Headers.ExpectContinue=false;
message.Content=新的StringContent(contents);
message.Content.Headers.ContentLength=contents.Length;
message.Content.Headers.ContentType=新的MediaTypeHeaderValue(mediaStream);
}
httpClient.Timeout=新的时间跨度(0,0,10,0,0);
HttpResponseMessage response=等待httpClient.SendAsync(消息);
response.EnsureSuccessStatusCode();
responseBodyAsText=response.Content.ReadAsStringAsync().Result;
}
}
捕获(HttpRequestException hre)
{
//responseBodyAsText=“异常:”+hre.消息;
responseBodyAsText=“无法连接(请检查您的网络连接)”;
isSuccessRequest=false;
}
捕获(例外情况除外)
{
//responseBodyAsText=“异常:”+ex.消息;
responseBodyAsText=“无法连接(请检查您的网络连接)”;
isSuccessRequest=false;
}
尝试
{
如果(isSuccessRequest)
{
if(typeof(T)=typeof(string))
{
OnSuccess?.Invoke((T)(对象)responseBodyAsText);
}
否则如果(类型(T)=类型(服务响应))
{
T result=JsonConvert.DeserializeObject(responseBodyAsText);
OnSuccess?.Invoke(结果);
}
其他的
{
var result=JsonConvert.DeserializeObject(responseBodyAsText);
var data=JsonConvert.DeserializeObject(Convert.ToString(结果));
OnSuccess?.Invoke(数据);
}
}
其他的
{
OnError?调用(新错误数据)
{
ErrorText=responseBodyAsText
});
}
}
捕获(例外e)
{
OnError?调用(新错误数据)
{
ErrorText=e.消息
});
}
}
}
公共类ErrorData:EventArgs
{
公共字符串ErrorText{get;set;}
公共布尔状态{get;set;}
}
}

但我得到的结果是空值。有人能帮忙吗?我做错了什么

谢谢。

这不起作用:

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

您是否真的在某处反序列化到类型
RootObject
?或者您正试图使用
将其强制转换为
?请提供一个,因为给定的代码给了我一个非空的
结果
值,与您所说的相反。仅供参考,您实际上并没有使用您提到的类,因为您使用的是
.DeserializeObject
的非泛型版本,这意味着您将获得一个
JObject
。如果以后将
结果作为RootObject
,则是,您将得到一个
null
。然而,这就是为什么我们需要一个,来确切地了解您在做什么。@Neelam最好不要把您的代码作为引号放进去。
var data=JsonConvert.DeserializeObject(Convert.ToString(result))
Uhh,除非
RootObject
ToString()
方法重载以返回JSON对象,否则
Convert.ToString()
不会执行您认为它会执行的操作
Convert.ToString(instanceOfRootObject)
将返回“CrossSampleApp1.Common.RootObject”(如果RootObject位于“CrossSampleApp1.Common”命名空间中),感谢您的支持,但我尝试了相同的RootObject r=JsonConvert.DeserializeObject(jsonInput);但是在文章中我不知道为什么它没有反映出反序列化与您的http操作无关。也许您的输入数据不正确?扩展了正在工作的示例。很抱歉,在您试图发布源代码时没有得到它,我们会发现您的问题。您发布的代码片段是正确的。我的示例使用了您的代码片段和作品。
var result = JsonConvert.DeserializeObject<RootObject>(responseBodyAsText);
var data = JsonConvert.DeserializeObject<T>(Convert.ToString(result));
OnSuccess?.Invoke(data);
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; }
}