programmer1010101 Ответов: 1

Ошибка JSON при использовании поля со списком


Я очень новичок в visual studio. Я пишу программу, которая будет извлекать подпись сотрудника из API, когда его имя вводится и нажимается кнопка "Получить пользователя" (например, если введено имя сотрудника Jane Doe, подпись "JDOE" будет извлечена из строки API, когда имя вводится и нажимается кнопка).

Мне удалось успешно прочитать данные с помощью текстового поля, однако я хотел бы включить поле со списком, чтобы оно предлагало имена при вводе пользователем (аналогично google).

Когда я пытаюсь запустить свой код с помощью поля со списком, то получаю следующую ошибку для своего JSON:
Newtonsoft.Json.JsonReaderException: 'неожиданный символ, встреченный при разборе значения: <. Путь ", строка 0, позиция 0.'

Это исключение было первоначально брошено в этот стек вызовов:
[внешний код]
TimeSheets_Try_11.Контроллеры.Веб-API.Getsignature(string) в WebAPI.cs
TimeSheets_Try_11.Form1.button1_Click(объект, система.EventArgs) в Form1.cs
[внешний код]


Что я уже пробовал:

строка формата JSON:
[{"signature":"JNDO","firstName":"Jane","fullName":"Doe, Jane","lastName":"Doe"}]


Код для моей формы windows:
namespace TimeSheets_Try_11

{
    public partial class Form1 : Form
    {
        WebAPI WA = new WebAPI();
      

        public Form1()
        {
            InitializeComponent();
            webBrowser1.Url = new Uri(StaticStrings.UrlIora);
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            comboBox1.DataSource = WA.Getsignature(textBox2.Text);
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {

        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            
        }

        private void button1_Click(AutoCompleteStringCollection combData)
        {
            
            
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Hide();
            Form2 p = new Form2();
            p.ShowDialog(); 
        }
    }
}


Код вызывающий JSON
namespace TimeSheets_Try_11.Controllers
{
    class WebAPI
    {
       

        public string Getsignature(string name)
        {

            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

            var cookies = FullWebBrowserCookie.GetCookieInternal(new Uri(StaticStrings.UrlIora), false);
            WebClient wc = new WebClient();
            wc.Encoding = System.Text.Encoding.UTF8;
            wc.Headers.Add("Cookie:" + cookies);
            wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
            wc.UseDefaultCredentials = true;
            string uri = "";

            uri = StaticStrings.UrlIora + name;

            var response = wc.DownloadString(uri);

            var status = JsonConvert.DeserializeObject<List<Employeename>>(response);

            string signame = status.Select(js => js.signature).First();
            return signame;

        }
}


Код, определяющий переменные:
namespace TimeSheet_Try11_Models
{

        // Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
        public class Employeename
        {
            public string signature { get; set; }
            public string firstName { get; set; }
            public string fullName { get; set; }
            public string lastName { get; set; }
        }

        public class Root
        {
            public List<Employeename> Employeename { get; set; }
       
        }
    
    

    }

1 Ответов

Рейтинг:
2

Gerry Schmitz

Вам нужно сериализовать / десериализовать "корневой" класс; обычно вы не можете сериализовать / десериализовать только список.

var status = JsonConvert.DeserializeObject<List<Employeename>>(response);


(Об этом говорится далее в комментариях к программе).


programmer1010101

Большое вам спасибо за ваш комментарий. Я действительно изменил это соответствующим образом, однако я все еще получаю ту же ошибку.

Sandeep Mewara

Во что ты превратился?

То, что предложил Джерри, - это иметь:
var status = JsonConvert.DeserializeObject<Root>(ответ);

Не думайте, что вы должны получить ту же ошибку, что и ранее с вышеизложенным. Поделитесь новым кодом и ошибкой.

programmer1010101

Да. Ниже приведен новый кодекс, который я пересмотрел:

Ури = StaticStrings.UrlIora + имя;

ВАР myJsonResponse = туалет.DownloadString(Ури);
Корневой myDeserializedClass = JsonConvert.DeserializeObject<root>(myJsonResponse);

строка signame = myDeserializedClass.Метод toString();
возвратный сигнал;
Однако я все еще получаю ту же ошибку.

Sandeep Mewara

Каково значение ответа при отладке?

programmer1010101

Он должен получить подпись сотрудника на основе имени, введенного в поле со списком, если это то, что вы имеете в виду, запрашивая значение. Поле со списком должно предлагать имена по мере их ввода (извините, если я не правильно ответил на вопрос, я очень новичок в программировании рефералов).

Richard Deeming

- Он должен восстановиться ..." это не фактическое значение ответа.

Отладьте свой код и проверьте его данные фактически делать извлекать. Это почти наверняка не тот JSON, который вы ожидаете.

programmer1010101

Спасибо за объяснение. Вы правы. Я получаю следующее значение (с новым кодом json):
"Строка не имеет формата JSON.





<title>IORA Central
<base href="/" />



загрузка <app-root & gt;...

"

Однако, когда я использовал текстовое поле вместо поля со списком вместе с исходным кодом JSON, я получал правильное значение.