Есть страница php которая получает данные из базы и преобразует в json. Получаю через Web запрос строку с json и десериализую через библиотеку Newtonsoft.Json. С одной записью справляется без проблем, но с двумя уже вылетает исключение. В List засунуть не получается.
static void Main(string[] args)
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://h92761ae.beget.tech/json.php");
httpWebRequest.ContentType = "text/json";
httpWebRequest.Method = "POST";
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
result = result.Remove(0,1);
result = result.Remove(result.Length - 1, 1);
RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(result);
Console.WriteLine(result.ToString());
Console.WriteLine("------------");
Console.WriteLine(rootObject.id);
Console.WriteLine("------------");
Console.WriteLine(rootObject.id_template);
Console.WriteLine("------------");
Console.WriteLine(rootObject.discription);
Console.WriteLine("------------");
Console.WriteLine(rootObject.device_code);
Console.WriteLine("------------");
}
Console.ReadLine();
}
public class RootObject
{
public string id { get; set; }
public string id_template { get; set; }
public string discription { get; set; }
public string device_code { get; set; }
}
Приходящий json:
[{"id":"1","id_template":"1","discription":"qweerty","device_code":"dvc-001"},{"id":"4","id_template":"2","discription":"dwagrhnthteh","device_code":"dvc-002"}]
Во первых, вы много делаете лишнего для получения данных! Для их получения можно обойтись 1-2 строками кода, ведь у вас нет на сервере проверок того, какой запрос должен быть, какие данные получить хотите и тд.
Перепишем все получение в две строки:
WebClient client = new WebClient();
var str = client.DownloadString("HTTP...");
После выполнения данного кода у вас в переменной str
будет весь ваш JSON
.
Ок, давайте теперь поговорим про проблему. Вы получаете массив, который пытаете запарсить как одиночный объект. К тому же вы массив походу и вовсе хотите на стороне клиента убрать, путем удаления первого символа (result = result.Remove(0,1);
), это не правильно!
Для грамотного получения ваших данных достаточно опять же указать всего 1 строку:
var json = JsonConvert.DeserializeObject<RootObject[]>(str);
Заметьте, мы задаем RootObject
, как массив, а не единичный объект. На выходе переменная json
будет содержать массив всех объектов с сервера, по которому достаточно пройтись циклом и вывести все, что вам нужно.
Пример:
foreach (var rootObject in json)
{
Console.WriteLine(rootObject.id);
Console.WriteLine("------------");
Console.WriteLine(rootObject.id_template);
Console.WriteLine("------------");
Console.WriteLine(rootObject.discription);
Console.WriteLine("------------");
Console.WriteLine(rootObject.device_code);
Console.WriteLine("------------");
}
Держи. Немного изменил твой код.
using System;
using System.Text;
using System.IO;
using System.Net;
using Newtonsoft.Json;
using System.Collections.Generic;
namespace JsonTest
{
public class RootObject
{
public string id { get; set; }
public string id_template { get; set; }
public string discription { get; set; }
public string device_code { get; set; }
}
class Program
{
static void Main(string[] args)
{
var httpWebRequest = (HttpWebRequest)WebRequest.Create("http://h92761ae.beget.tech/json.php");
httpWebRequest.ContentType = "text/json";
httpWebRequest.Method = "POST";
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
Stream receiveStream = httpResponse.GetResponseStream();
StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
List<RootObject> result = JsonConvert.DeserializeObject<List<RootObject>>(readStream.ReadToEnd());
foreach (RootObject element in result)
{
Console.WriteLine(element.ToString());
Console.WriteLine("------------");
Console.WriteLine(element.id);
Console.WriteLine("------------");
Console.WriteLine(element.id_template);
Console.WriteLine("------------");
Console.WriteLine(element.discription);
Console.WriteLine("------------");
Console.WriteLine(element.device_code);
Console.WriteLine("------------");
}
Console.ReadLine();
}
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Строю полигоны в c# и заполняю ими соответствующую табличку в sqlserver(где уже есть информация и айдишники полигонов), примерно вот так:
Не могу разобраться как использовать делегаты и события в проекте UnityУ меня есть класс Observer
Есть форма туда вводишь данные и должен создаваться билд программы с измененными данными