Arhn - архитектура программирования

Преобразование JSON в объект

у меня есть метод, который отправляет запрос POST моему API PHP, и API отвечает возвращаемым значением строки JSON.

однако после использования JsonConvert.DeserializeObject() для результата JSON я получаю этот формат

{[
  {
    "usr_name": "12-34567",
    "usr_fullname": "LASTNAME, FIRSTNAME MIDDLENAME",
    "usr_emailaddress": "[email protected]",
    "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 для этой цели, я впервые имею дело с JSON внутри С#, поэтому я совершенно не знаю, как и что делать. я провел несколько исследований только для того, чтобы найти устаревшие руководства или вопросы, в отличие от моего возвращенного значения JSON.

поэтому ответ php выглядит следующим образом: введите здесь описание изображения

и после попытки его десериализации он выглядит так: введите здесь описание изображения

26.08.2016

  • у вас есть объект, содержащий массив, который содержит один объект. что бы вы ни десериализовали, ваш myobject существует только на 2 уровня ниже этого декодированного объекта. 26.08.2016
  • @TheQuestioner может быть, эта ссылка поможет вам [stackoverflow.com/questions/9858448/ 26.08.2016
  • попробуйте дегенерировать json в MyObject[] не MyObject 26.08.2016
  • @hellostone это сработало. хотя есть ли способ устранить нежелательный массив с одним индексом? 27.08.2016
  • Если вы не можете изменить ответ JSON, лучше всего присвоить первый индекс массива новому объекту. var myObj = myObject[0] 27.08.2016

Ответы:


1

Ваша строка json недействительна json - упаковка {} недействительна. Вы должны проверить, как строка json генерируется/кодируется внутри вашего php API.

26.08.2016
  • очевидно, я не могу контролировать, как генерируется результат JSON, поскольку API, который я использую, был предоставлен мне только без какой-либо дополнительной документации, кроме комментариев, указывающих примерные параметры для каждой функции внутри указанного API. 26.08.2016
  • Это было в очереди на проверку низкого качества, но я голосую за то, чтобы оставить его здесь, потому что он законно отвечает на вопрос. 26.08.2016

  • 2

    Если бы мне пришлось угадывать, я бы сказал, что вы сериализовали этот объект в PHP из запроса к базе данных, который обычно возвращает массив строк. Вот почему ваш JSON — это объект с массивом, который содержит объект.

    Там есть дополнительный уровень косвенности, поэтому вам нужно удалить его для десериализации. Попробуйте использовать array_pop в своем PHP, чтобы убедиться, что вы сериализуете только один объект, или просто используйте fetch вместо эквивалента fetchAll для вашего интерфейса базы данных в PHP, если вы ожидаете только одно значение. В противном случае выполните итерацию по массиву объектов после десериализации в C#.

    26.08.2016
  • честно говоря, я не знаю, как я мог бы ответить на ваш вопрос. потому что PHP API, который я использую, был предоставлен мне. Затем API будет извлекать данные из базы данных в соответствии с функцией, которую я вызываю из api.php. и результат json будет отформатирован следующим образом => [{"usr_name":"12-34567","usr_fullname":"LASTNAME, FIRSTNAME MIDDLENAME","usr_emailaddress":"[email protected]","photo_url":"http:\/\/mywebsite.com\/fetch_photo.php?id=MTItNDA1D2DMDY=","token":"64c420939814c62889ea143d17736841"}] 26.08.2016
  • Я не понял, что задал вопрос. Я был совершенно уверен, что это был раздел ответов, но если у вас есть контроль как над кодом PHP, так и над кодом C #, это выбор дилера на этом этапе. В любом случае, чтобы решить проблему, вам нужно удалить дополнительный уровень косвенности в том или ином месте. 26.08.2016
  • не могли бы вы дать мне пошаговое руководство о том, как я могу этого добиться? 26.08.2016
  • Где? В PHP или в С#? В PHP, если то, что вы возвращаете, является фактической строкой JSON, как вы говорите, просто json_decode(), array_pop() и json_encode() снова. В С# вам нужно будет десериализовать List, что-то вроде JsonConvert.DeserializeObject(List<string>>(json), перебрать это, и внутри вашего цикла у вас будет объект. 26.08.2016
  • когда я пытаюсь json_decode в PHP, я получаю эту ошибку i.imgur.com/c5P5oT3.png 26.08.2016
  • Это не было результатом json_decode. Если вы посмотрите на строку 13 скрипта home.php, где сообщение об ошибке явно сообщает вам, что произошла ошибка, вы, вероятно, обнаружите, что пытались echo/print переменную, которая была массивом, а не строкой. 26.08.2016

  • 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'}]}.

    ОБНОВЛЕНИЕ: Забудьте об этом ответе! Вы хотите сделать это на С#, а не на PHP :)

    26.08.2016
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..