将JSON转换为对象

时间:2016-08-26 14:15:12

标签: c# php json json.net

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

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

{[
  {
    "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; } } 添加到我的类,其结构如下

require

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

所以php的回复看起来像这样 enter image description here

并且在尝试反序列化之后,它看起来像这样 enter image description here

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

在那里有一个额外的间接级别,所以你需要删除它来反序列化。尝试在PHP中使用array_pop以确保您只序列化单个对象,或者只使用PHP中的数据库接口的npm run jshint 而不是fetch等效项,如果您只是期望一个单一的价值。否则,在C#中反序列化后迭代对象数组。

答案 2 :(得分:1)

这可能是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中这样做:)