Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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# Newtonsoft.Json.JsonReaderException:&x27;分析值[]时遇到意外字符。_C#_Php_Json_Http_Json.net - Fatal编程技术网

C# Newtonsoft.Json.JsonReaderException:&x27;分析值[]时遇到意外字符。

C# Newtonsoft.Json.JsonReaderException:&x27;分析值[]时遇到意外字符。,c#,php,json,http,json.net,C#,Php,Json,Http,Json.net,我第一次在做C#JSON PHP JSON。 我以为我会走上一条轻松的道路,但似乎我已经触礁了 我相当确定Newtonsoft的JSON允许使用“[”字符,但不确定为什么会出现此错误 这是我的C代码: 公共类SystemJSON { 公共布尔状态{get;set;} 公共字符串消息{get;set;} 公共字符串响应数据{get;set;} } 公共静态类SystemCall { 公共静态字符串Post(字符串uri、NameValueCollection对) { 字节[]响应=null; 使用

我第一次在做C#JSON PHP JSON。 我以为我会走上一条轻松的道路,但似乎我已经触礁了

我相当确定Newtonsoft的JSON允许使用“[”字符,但不确定为什么会出现此错误

这是我的C代码:

公共类SystemJSON
{
公共布尔状态{get;set;}
公共字符串消息{get;set;}
公共字符串响应数据{get;set;}
}
公共静态类SystemCall
{
公共静态字符串Post(字符串uri、NameValueCollection对)
{
字节[]响应=null;
使用(WebClient wc=new WebClient())
{
响应=wc.uploadValue(uri,对);
}
返回Encoding.Default.GetString(响应);
}
}
字符串system\u Response=SystemCall.Post(“http://127.0.0.1:8080/edsa-NEFS%20(PHP)/api.PHP“,新的NameValueCollection()
{
{“do_work”,Functions.Get_Department_List.ToString()},
{“api_数据”,null}
});
**SystemJSON SystemJSON=JsonConvert.DeserializeObject(system_Response);***/问题在于您的C#SystemJSON类与传入JSON的结构不匹配

C#SystemJSON类中的
ResponseData
被列为
string
,但您的PHP似乎在该属性中推出了一个复杂的对象。您无法将对象反序列化为字符串-反序列化器无法知道如何将对象结构转换为合适的字符串,而且无论如何,它不是gene集合一个有用的或合乎逻辑的事情来做。因此,它会抛出一个错误,说对象结构不匹配

您看到的特定错误意味着反序列化程序期望一个
表示字符串的开始,但它看到的是
{
表示另一个对象的开始


为什么会发生这种情况?PHP代码将生成一个JSON响应,如下所示:

{
    "Status": true,
    "Message": "SUCCESS",
    "ResponseData": {
        "dept": {
            "id": 2,
            "name": "Test",
            "description": "Testing",
            "status": 1
        }
    }
}

如您所见,ResponseData包含一个对象,该对象有一个“dept”,而dept又是另一个具有四个以上属性的对象

为了正确地反序列化,需要修改SystemJSON类,并且还需要两个子类来帮助完成此操作:

public class SystemJSON
{
    public bool Status { get; set; }
    public string Message { get; set; }
    public ResponseData ResponseData { get; set; }
}

public class ResponseData {
    public Department dept {get; set; }
}

public class Department {
    public string id {get; set; }
    public string description {get; set; }
    public int status {get; set; }
}
现在您将能够正确地反序列化JSON


另外,
[
字符在这里似乎无关紧要……不清楚你为什么在问题中提到这个



p.p.S.通过查看您的PHP,我猜您可能打算在ResponseData中返回不同的数据结构,这取决于为
do_work
指定的参数,即取决于调用的PHP函数。如果是这样,那么您需要相应地修改您的C,以便它反序列化到不同的具体类取决于它请求的API方法。或者,您可能会欺骗并将
ResponseData
指定为
dynamic
,然后它将接受它接收到的任何数据结构,尽管需要注意的是,它现在实际上是松散类型的,因此在编译代码时会失去某些好处,例如检查pro的有效使用情况相关名称、数据类型等。

请更新您的问题,以包括
system\u Response
的确切值(不要猜测)。嗯……好吧。我想我理解您的意思。至于“[”,当我在另一组伪字符串上测试时,它抛出了这个字符,它是关于“[“但后来我测试了要传输的不同数据,结果显示为“{”。Nvm,既然你已经向我解释了,我想我知道哪里出错了。非常感谢。@ZeroKhor没问题……如果你觉得答案对你有帮助,请记住将其标记为“已接受”(单击答案旁边的勾号,使其变为绿色)-谢谢:-)
{
    "Status": true,
    "Message": "SUCCESS",
    "ResponseData": {
        "dept": {
            "id": 2,
            "name": "Test",
            "description": "Testing",
            "status": 1
        }
    }
}
public class SystemJSON
{
    public bool Status { get; set; }
    public string Message { get; set; }
    public ResponseData ResponseData { get; set; }
}

public class ResponseData {
    public Department dept {get; set; }
}

public class Department {
    public string id {get; set; }
    public string description {get; set; }
    public int status {get; set; }
}