【问题标题】:Converting JSON to an Object将 JSON 转换为对象
【发布时间】:2017-01-03 06:01:49
【问题描述】:

我有一个向我的 PHP API 发送 POST 请求的方法,API 以 JSON 字符串返回值进行响应。

然而,在对 JSON 结果使用JsonConvert.DeserializeObject() 之后,我得到了这种格式

{[
  {
    "usr_name": "12-34567",
    "usr_fullname": "LASTNAME, FIRSTNAME MIDDLENAME",
    "usr_emailaddress": "myemail@mail.com",
    "photo_url": "http://mywebsite.com/fetch_photo.php?id=MTItNDA1MDY=",
    "token": "64c420939814c62889ea143d17736841"
  }  
]}

但是我无法将其 Deserialize 发送到我的类,其结构如下所示

public class MyObject
{
    public string usr_name { get; set; }
    public string usr_fullname { get; set; }
    public string usr_emailaddress { get; set; }
    public string photo_url { get; set; }
    public string token { get; set; }
}

我为此目的使用 Newtonsoft JSON.Net,这是我第一次在 C# 中处理 JSON,所以我完全不知道如何或做什么。我做了几项研究,只是为了找到与我返回的 JSON 值不同的过时教程或问题

所以 php 的响应看起来像这样

在尝试反序列化之后,它看起来像这样

【问题讨论】:

  • 您有一个对象,其中包含一个包含单个对象的数组。无论您反序列化到什么,您的“myobject”只存在于该解码对象内部的 2 层。
  • @TheQuestioner 可能这个链接会帮助你 [stackoverflow.com/questions/9858448/…
  • 尝试将 json 反序列化为 MyObject[] 而不是 MyObject
  • @hellowstone 成功了。虽然有什么办法可以消除不需要的单索引数组吗?
  • 如果您无法更改响应 JSON,最好的方法是将数组的第一个索引分配给新对象。 var myObj = myObject[0]

标签: c# php json json.net


【解决方案1】:

您的 json 字符串是无效的 json - 包装 {} 无效。您应该检查 json 字符串是如何在您的 php API 中生成/编码的。

【讨论】:

  • 显然我无法控制 JSON 结果的生成方式,因为我使用的 api 仅提供给我,没有任何进一步的文档,除了 cmets 指出所述 api 中每个函数的示例参数跨度>
  • 这是在低质量审核队列中,但我投票保留它,因为它合法地回答了问题。
【解决方案2】:

如果我不得不猜测,我会说您在 PHP 中从数据库查询中序列化了这个对象,该查询通常返回一个行数组。这就是为什么你的 JSON 是一个包含一个对象的数组的对象。

那里有一个额外的间接级别,因此您需要将其删除以进行反序列化。尝试在您的 PHP 中使用 array_pop 以确保您只序列化单个对象,或者如果您只需要一个值,则在 PHP 中的数据库接口中使用 fetch 而不是 fetchAll 等效项。否则,在 C# 中反序列化后迭代对象数组。

【讨论】:

  • 说实话,我不知道该如何回答你的问题。因为我使用的 PHP API 是提供给我的。然后,api 将根据我从 api.php 调用的函数从数据库中获取数据。然后结果的 json 将被格式化为这样 => [{"usr_name":"12-34567","usr_fullname":"LASTNAME, FIRSTNAME MIDDLENAME","usr_emailaddress":"myemail@mail.com","photo_url":"http:\/\/mywebsite.com\/fetch_photo.php?id=MTItNDA1D2DMDY=","token":"64c420939814c62889ea143d17736841"}]
  • 我没有意识到我问了一个问题。我相当肯定这是答案部分,但如果您同时控制 PHP 代码和 C# 代码,那么此时经销商的选择。无论哪种方式来解决问题,您都需要在一个地方或另一个地方删除额外的间接级别。
  • 你能给我一个关于如何实现这一目标的演练吗?
  • 在哪里?在 PHP 中还是在 C# 中?在 PHP 中,如果你得到的是实际的 JSON 字符串,就像你说的,只是 json_decode()array_pop()json_encode()。在 C# 中,您需要反序列化为 List,类似于 JsonConvert.DeserializeObject(List<string>>(json),对其进行迭代,然后在循环中您将拥有该对象。
  • 当我在PHP 中尝试json_decode 时,我收到此错误i.imgur.com/c5P5oT3.png
【解决方案3】:

这可能是 PHP 中的一个灵魂(如果你的 json 示例是正确的):

$obj = new MyClass();//get empty instance
$arr = json_decode(trim($json,'}{'),true);//get array from json, but fix it first
//because {[{'key':'value'}]} is not valid!
$arr = $arr[0];//get sub array with real data
//bind all data to your object
array_walk($arr,function($v,$k) use ($obj){ $obj->{$k}=$v; });

print $obj->usr_name;// output: 12-34567

为什么{[{'key':'value'}]} 无效? 对象成员必须有名字!

所以这将是有效的 json:{'content':[{'key':'value'}]}

更新:忘记这个答案!您想在 C# 中而不是在 PHP 中执行此操作 :)

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多