hottabxp
@hottabxp
Программист-самоучка, ищущий подработку(

Кто может дать пример парсинга json в C#?

Уже несколько дней борюсь в c# с json. В delphi работать с json или xml очень просто в сравнении с C#. Перерыл около сотни статей и форумов по работе с json в C#, но в них что-то типа этого:
15b37b8cfca24a66954e6893e617d296.jpg
Эта картинка также относится и к документации библиотекам для работы с json.
Кто может привести минимальный код на C#? Нужно в ListBox занести значения с title и url.
{
	"response":{
	"count":198,
	"items":[
	{
		"id":340125039,
		"owner_id":34254853,
		"artist":"IOWA",
		"title":"Маршрутка",
		"duration":190,
		"url":"http:\/\/cs7-5v4.vk-cdn.net\/p12\/630de313d73392.mp3?extra=fNremCtKgl4pnCbyZ0q-LOBIfvRoUf5QGo8oWwYrOCza6AlSUOdYIImUideFd3hpPa325ckSD_c3zQ5FNluMS80lrSJiM6FC",
		"genre_id":9
	},
	{
		"id":340120602,
		"owner_id":34254853,
		"artist":"Stromae",
		"title":"Tous Les Memes",
		"duration":168,
		"url":"http:\/\/cs7-1v4.vk-cdn.net\/p18\/600b1a66ef64d6.mp3?extra=GNP79R4nHR39dY50YJ_ddDxEuX6SQcxtG3nCgzI0LdvxoaLh5lQ2qZqqpABCqPoXOISyNzWOqMZx4_nTL3bQ31i57z-UXl4V",
		"lyrics_id":99395752

	}
	]
	}
}

PS: Можно конечно сделать на delphi dll, которая будет обрабатывать json, потом подключить эту dll в проект на C#, но это на худой конец конечно, так как я не считаю этот метод правильным.
  • Вопрос задан
  • 43062 просмотра
Решения вопроса 1
lexxpavlov
@lexxpavlov
Программист, преподаватель
Json.NET
Пакет NuGet

В пустой WPF проект добавьте listBox1, установите через NuGet пакет, и замените MainWindow.xaml.cs на этот код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using Newtonsoft.Json;

namespace WpfApplication9
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Data data = JsonConvert.DeserializeObject<Data>(json);
            foreach (Item item in data.Response.Items)
            {
                listBox1.Items.Add(new ListBoxItem() { Content = item });
            }
        }
    
        class Data
        {
            public Response Response;
        }

        class Response
        {
            public int Count;
            public Item[] Items;
        }

        class Item
        {
            public int Id;
            public int Owner_id;
            public string Artist;
            public string Title;
            public int Duration;
            public string Url;
            public int Genre_id;

            public override string ToString()
            {
                return string.Format("{0} ({1})", Title, Url);
            }
        }

        string json = @"{
  ""response"":{
  ""count"":198,
  ""items"":[
  {
    ""id"":340125039,
    ""owner_id"":34254853,
    ""artist"":""IOWA"",
    ""title"":""Маршрутка"",
    ""duration"":190,
    ""url"":""http:\/\/cs7-5v4.vk-cdn.net\/p12\/630de313d73392.mp3?extra=fNremCtKgl4pnCbyZ0q-LOBIfvRoUf5QGo8oWwYrOCza6AlSUOdYIImUideFd3hpPa325ckSD_c3zQ5FNluMS80lrSJiM6FC"",
    ""genre_id"":9
  },
  {
    ""id"":340120602,
    ""owner_id"":34254853,
    ""artist"":""Stromae"",
    ""title"":""Tous Les Memes"",
    ""duration"":168,
    ""url"":""http:\/\/cs7-1v4.vk-cdn.net\/p18\/600b1a66ef64d6.mp3?extra=GNP79R4nHR39dY50YJ_ddDxEuX6SQcxtG3nCgzI0LdvxoaLh5lQ2qZqqpABCqPoXOISyNzWOqMZx4_nTL3bQ31i57z-UXl4V"",
    ""lyrics_id"":99395752

  }
  ]
  }
}";
}
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Oxoron
Шарпер
internal static class Serializer
    {
        internal static void Serialize<T>(this T arg, string fileName)
        {
            string res = JsonConvert.SerializeObject(arg, Formatting.Indented);
            File.WriteAllText(fileName,res);
        }

        internal static T Deserialize<T>(string fileName)
        {
            string json = File.ReadAllText(fileName);
            T res = JsonConvert.DeserializeObject<T>(json);
            return res;
        }
    }

Этот класс сериализует\десериализует объекты.

public class Item 
{
...
public string title{get; set;}
public string url{get;set;}
...
}

Это класс одной записи. Для сериализации используйте автосвойства (те самые get; set;), обязательно public.

public class Response
{
public int count{get;set;}
public List<Item> items{get; set;}
}


Для получения данных используете код вроде
string pathToFIle = @"C:\temp\anyFile";
Response response = Serializer.Deserialize<Response>(pathToFile);
String[] titles = response.items.Select(item => item.title).ToArray(); // Массив названий
String[] urls = response.items.Select(item => item.url)ToArray(); // Массив адресов


библиотека: newtonsoft.json.dll

Если надо - могу скинуть готовый пример (на тостере есть личка?).

Также посетите json2csharp.com
Вставьте в поле свой Json-образец, сразу получите необходимые классы.
Ответ написан
GavriKos
@GavriKos
Вот пример, крайне похожий на ваш:
stackoverflow.com/questions/13469666/how-to-parse-...
Используется LitJson. Суть: заводите классы для сериализации, в них делаете get-еры на поля, названные так же как поля json. Все. В примере по ссылке даже массив есть.
Чуть сложнее - JBoy. Можете и его использовать, пример тоже легко гуглится.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы