Как получить массив из json в c#

249
21 февраля 2018, 07:48

Есть страница 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"}]
Answer 1

Во первых, вы много делаете лишнего для получения данных! Для их получения можно обойтись 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("------------");
}
Answer 2

Держи. Немного изменил твой код.

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();
        }
    }
}

READ ALSO
Не понимаю как работает Regex

Не понимаю как работает Regex

Хочу обернуть теги вида: #янаморе, #какделаВ кликаблельные ссылки

156
SQLGeography in SQL Server

SQLGeography in SQL Server

Строю полигоны в c# и заполняю ими соответствующую табличку в sqlserver(где уже есть информация и айдишники полигонов), примерно вот так:

196
Проблема с делегатами и событиями в Unity

Проблема с делегатами и событиями в Unity

Не могу разобраться как использовать делегаты и события в проекте UnityУ меня есть класс Observer

146
Как создать измененный exe c# [требует правки]

Как создать измененный exe c# [требует правки]

Есть форма туда вводишь данные и должен создаваться билд программы с измененными данными

183