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' =&gt; NULL?测试 JSON 似乎没有反映这一点。 这是来自另一个测试。我也尝试删除所有字段并离开 is_successful 并且发生相同的错误。我的本地应用似乎很难从服务器反序列化 json。 到目前为止唯一成功的是返回一个简单的字符串 我发现了发生了什么。 $this->response 已经做了 json_encode!我一直在无缘无故地加倍工作。我很抱歉。

以上是关于PHP json_encode 到 C# 对象无法转换的主要内容,如果未能解决你的问题,请参考以下文章

PHP - json_encode中文乱码

PHP:对象数组 - 序列化与 json_encode - 替代方案?

在 PHP 中的对象上使用 json_encode(无论范围如何)

PHP json_encode转换空数组为对象

PHP json_encode将行作为对象而不是数组返回[重复]

PHP中json_encode返回的值无法被前端识别