PHP json_encode 到 C# 对象无法转换
Posted
技术标签:
【中文标题】PHP json_encode 到 C# 对象无法转换【英文标题】:PHP json_encode to C# Object unable to convert 【发布时间】:2021-09-20 11:12:11 【问题描述】:我有这个对象数组,其中包含一些字符串和我想从服务器返回的字符串数组:
"["original_file_name":"Plain_HAIR.pdf","encrypted_file_name":"UTTSJG13V1EC46J.pdf","is_successful":true,"message":"","email":"[\"testuser@gmail .com\"]","doctype":"HAIR"]"
在我的本地应用程序中,我有一个如下所示的类:
public class FileUploadResultViewModel
public string original_file_name get; set;
public string encrypted_file_name get; set;
public string is_successful get; set;
public string message get; set;
public string email get; set;
public string doctype get; set;
if (res.StatusCode == System.Net.HttpStatusCode.OK)
return JsonConvert.DeserializeObject<List<FileUploadResultViewModel>>(res.Content);
else
return null;
问题是当它回到本地应用程序时,我收到一条错误消息:
"错误转换值 "["original_file_name":"Plain_HAIR.pdf","encrypted_file_name":"UTTSJG13V1EC46J.pdf","is_successful":true,"message":"","email":"["testuser@gmail.com"] ","doctype":"头发"]" 输入 'System.Collections.Generic.List`1[Uploader.ViewModels.FileUploadResultViewModel]'。 路径'',第 1 行,位置 1521。"
是我转换错误还是缺少某些步骤?
编辑:
这是我在服务器上定义对象的方式:
$object = (object) [
'original_file_name' => $item["original_file_name"],
'encrypted_file_name' => $item["file_name"],
'is_successful' => true,
'message' => '',
'email' => NULL,
'doctype' => $item["doctype"]
];
array_push($myArray, $object);
$this->response(json_encode($myArray));
编辑 2:显示检索 json 结果的方法
public FileUploadResultViewModel Upload(List<FileUploadViewModel> sdvm)
var js = JsonConvert.SerializeObject(sdvm);
RestClient client = new RestClient();
var link = url;
var username = username;
var password = password;
client.BaseUrl = new Uri(link);
client.Authenticator = new HttpBasicAuthenticator(username, password);
RestRequest request = new RestRequest();
request.AddJsonBody(sdvm);
request.Method = Method.POST;
var res = client.Execute(request);
if (res.StatusCode == System.Net.HttpStatusCode.OK)
return JsonConvert.DeserializeObject<FileUploadResultViewModel>(res.Content);
else
return null;
【问题讨论】:
我看到一个错误:"is_successful":true
is a bool, not a string
这与 php 没有任何关系。 json_encode()
函数只是创建标准的字符串化 json,所以它来自 PHP 的事实在这里无关紧要。
@MagnusEriksson 我明白了。我只是想知道生成的 json 是否有任何问题,因为 c# 似乎无法将其解析为对象。
您需要定义正确的数据类型,如@RoarS。指出。
@MagnusEriksson 我刚刚通过将 is_successful 设置为 bool 进行了测试,并发生了同样的错误。
【参考方案1】:
更新:
最终解决方案是json_encode
太多了。
在var res = client.Execute(request);
之前的那行,添加这个:
request.OnBeforeDeserialization = resp => resp.ContentType = "application/json"; ;
这是有效的:
var json = @"[""original_file_name"":""Plain_HAIR.pdf"",""encrypted_file_name"":""UTTSJG13V1EC46J.pdf"",""is_successful"":true,""message"":"""",""email"":""[\""testuser@gmail.com\""]"",""doctype"":""HAIR""]";
var convertedInstance = JsonConvert.DeserializeObject<List<FileUploadResultViewModel>>(json);
与"
的包围也有效
var json2 = @"""[""original_file_name"":""Plain_HAIR.pdf"",""encrypted_file_name"":""UTTSJG13V1EC46J.pdf"",""is_successful"":true,""message"":"""",""email"":""[\""testuser@gmail.com\""]"",""doctype"":""HAIR""]""";
var convertedInstance2 = JsonConvert.DeserializeObject<List<FileUploadResultViewModel>>(json);
【讨论】:
它也适用于我使用 Postman 进行测试。当它进入我的本地应用程序时它不起作用。 @JianYA:你如何以 JSON 格式发送这个:'email' => NULL
?测试 JSON 似乎没有反映这一点。
这是来自另一个测试。我也尝试删除所有字段并离开 is_successful 并且发生相同的错误。我的本地应用似乎很难从服务器反序列化 json。
到目前为止唯一成功的是返回一个简单的字符串
我发现了发生了什么。 $this->response 已经做了 json_encode!我一直在无缘无故地加倍工作。我很抱歉。以上是关于PHP json_encode 到 C# 对象无法转换的主要内容,如果未能解决你的问题,请参考以下文章
PHP:对象数组 - 序列化与 json_encode - 替代方案?
在 PHP 中的对象上使用 json_encode(无论范围如何)