티스토리 뷰

IT/C#

[CS][WPF] json Parsing하여 Listview에 뿌려주기

주인장 진빼이

WPF 태그는 처음에 적응이 쉬웠지만 Style, Templete으로 갈 수록 복잡해진다.
하지만 Winform보다 재미는 있다.

프로그램은 너무 간단해서 설명할 것이 없다.
사실 WPF Tag를 다뤄보는 것이 목표였다.

WPF 태그에 대해서 데이터 바인딩, Eamil 컬럼 우측 정렬, Body 컬럼 내용 자동 줄바꿈(Wrap), ID ListViewItem 요소 우측 정렬을 공부했었다. 며칠 지나면 다 까먹을 수도 있지만 반복학습은 무엇보다 중요하다.

// MainWindow.xaml
<Window x:Class="WPF_ListviewJson.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_ListviewJson"
        mc:Ignorable="d"
        Title="Json Parsing" Height="350" Width="773">
    <Window.Resources>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <Setter Property="VerticalContentAlignment" Value="Stretch" />
        </Style>
    </Window.Resources>

    <Grid>
        <Button Content="Clear" HorizontalAlignment="Right" Margin="0,10,10,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
        <Button Content="Refresh" HorizontalAlignment="Right" Margin="0,10,90,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
        <ListView x:Name="lview_Data" Margin="10,42,10,10"
                  ScrollViewer.HorizontalScrollBarVisibility="Disabled">
            <ListView.Resources>
                <Style x:Key="HeaderStyle" TargetType="GridViewColumnHeader">
                    <Setter Property="HorizontalContentAlignment" Value="Right"/>
                </Style>


            </ListView.Resources>

            <ListView.View>

                <GridView>
                    <GridViewColumn Width="120" Header="postId" DisplayMemberBinding="{Binding PostID}"/>
                    <GridViewColumn Width="120" Header="*ID">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding ID}" TextAlignment="Right" />
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                    <GridViewColumn Width="200" Header="Email" DisplayMemberBinding="{Binding Email}" HeaderContainerStyle="{StaticResource HeaderStyle}"/>

                    <GridViewColumn Width="300" Header="Body">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock TextWrapping="Wrap" Text="{Binding Body}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <WrapPanel Margin="0" />
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
        </ListView>
    </Grid>
</Window>
// MainWindow.cs
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
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 WPF_ListviewJson.Data;

namespace WPF_ListviewJson
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            //Clear
            lview_Data.ItemsSource = null;
        }

        private async void Button_Click_1(object sender, RoutedEventArgs e)
        {
            // Refresh
            string responseData = String.Empty;
            var task = Task.Run(() =>
            {
                responseData = GetResponseData("https://jsonplaceholder.typicode.com/comments");
            });
            await task;
            lview_Data.ItemsSource = ParseComment(responseData);
        }

        public string GetResponseData(string url)
        {
            string responseData = String.Empty; 
            try 
            {
                WebRequest req = WebRequest.Create(url);
                req.Method = "GET";

                using (WebResponse response = req.GetResponse())
                {
                    using (Stream stream = response.GetResponseStream())
                    {
                        using (StreamReader sr = new StreamReader(stream))
                        {
                            responseData = sr.ReadToEnd();
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                throw ex;
            }
            return responseData;
        }

        public List<Comments> ParseComment(string jsonData)
        {
            List<Comments> commentList = new List<Comments>();

            JArray jsonCommentList = JsonConvert.DeserializeObject<JArray>(jsonData);

            Comments comment = null;
            foreach (JObject item in jsonCommentList)
            {
                comment = new Comments() {
                    PostID = int.Parse(item["postId"].ToString()),
                    ID = int.Parse(item["id"].ToString()),
                    Name = item["name"].ToString(),
                    Email = item["email"].ToString(),
                    Body = item["body"].ToString().Replace('\n', ' ')
                };
                commentList.Add(comment);
            }
            return commentList;

        }
    }
}
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함