【问题标题】:PHP json_encode to C# Object unable to convertPHP json_encode 到 C# 对象无法转换
【发布时间】: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 进行了测试,并发生了同样的错误。

标签: c# php json rest


【解决方案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!我一直在无缘无故地加倍工作。我很抱歉。
猜你喜欢
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
相关资源
最近更新 更多