質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

解決済

C#で読み込んだJsonファイルを編集したい

tranokado
tranokado

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1回答

-1評価

1クリップ

348閲覧

投稿2022/04/16 09:45

前提・実現したいこと

WPFのアプリケーションで、読み込んだJsonファイルを編集しその変更を元のJsonファイルにも適用させたい

お世話になります。

現在WPFのアプリケーションを作成しており、

画面上の「開く」ボタンを押すことでエクスプローラーからjsonファイルを呼び出し
デシリアライズを行って画面上に必要なデータを表示する

部分までの機能を実装しています。

今後このデータを画面上で編集する機能を作成したいと思っているのですが、どのように実現するのがよいかわからず詰まってしまっている状況です。

jsonデータを編集する機能についてご教授いただけますと幸いです。

コードに基づく具体的な実現したいこと

  • subname欄に表示される項目押下時、その項目をsubnameから排除(取り除く)する機能
  • subname欄に表示される項目押下時、その項目を別のnameに移動またはコピーさせる機能
  • subnameを追加する機能

該当のソースコード

xaml

<Window x:Class="ManagerEditor.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:ManagerEditor" mc:Ignorable="d" Title="MainWindow" Height="800" Width="1100"> <Grid> <Grid x:Name="LeftRoot" Margin="10,10,-10,-10"> <Grid.ColumnDefinitions> <ColumnDefinition Width="10*"/> <ColumnDefinition Width="27*"/> </Grid.ColumnDefinitions> <Button x:Name="OpenButton" Width="120" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,10,0,0" Content="開く" FontSize="18" Click="OpenButton_Click" /> <TextBlock HorizontalAlignment="Left" Margin="10,60,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="31" Width="101" FontSize="18"><Run Language="ja-jp" Text="name"/><LineBreak/><Run Language="ja-jp"/></TextBlock> <ListBox x:Name="UnitnameListBox" SelectionChanged="UnitNameListBox_SelectionChanged" Margin="0,100,0,12" ScrollViewer.HorizontalScrollBarVisibility="Disabled" DisplayMemberPath="name" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding}" HorizontalAlignment="Center" Width="275" /> <TextBlock x:Name="Display" Grid.Column="2" HorizontalAlignment="Left" Margin="10,41,0,0" TextWrapping="Wrap" VerticalAlignment="Top" FontSize="18"><Run Language="ja-jp" Text="name"/><LineBreak/><Run Language="ja-jp"/></TextBlock> <TextBlock x:Name="DisplayBox" Grid.Column="1" HorizontalAlignment="Left" Margin="10,78,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="326" Height="46"/> <TextBlock Grid.Column="1" HorizontalAlignment="Left" Margin="10,122,0,0" TextWrapping="Wrap" Text="URL" VerticalAlignment="Top" FontSize="18"/> <TextBlock x:Name="URLBox" Grid.Column="1" HorizontalAlignment="Left" Margin="10,151,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="39" Width="595"/> <TextBlock HorizontalAlignment="Left" Margin="10,194,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Height="31" Width="116" FontSize="18" Grid.Column="1"><Run Language="ja-jp" Text="subname"/></TextBlock> <ListBox x:Name="SubnameListBox" Margin="10,230,27,12" ScrollViewer.HorizontalScrollBarVisibility="Disabled" DisplayMemberPath="subname" ItemsSource="{Binding / manager_list}" Grid.Column="1" /> </Grid> </Grid> </Window>

C#

// Copyright © 2022 Tsubasa co., Ltd. All rights reserved. using Microsoft.Win32; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Windows; using System.Windows.Controls; namespace ManagerEditor { /// <summary> /// メイン画面 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Window_Loaded(object sender, RoutedEventArgs e) { } PersonalData[] _data; //Jsonデータのデシリアライズ、格納 private void OpenButton_Click(object sender, RoutedEventArgs e) { var dialog = new OpenFileDialog(); dialog.Filter = "json|*.json"; if (dialog.ShowDialog().Value) { var file = dialog.FileName; try { var reader = new StreamReader(file); var data = reader.ReadToEnd(); reader.Close(); _data = JsonConvert.DeserializeObject<PersonalData[]>(data); } catch (Exception error) { if (error.Message != null) Debug.WriteLine(error.Message); } if (_data != null) { DataContext = _data; } URLBox.Text = ""; DisplayBox.Text = ""; } } //グループ押下時の挙動設定 private void UnitNameListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (UnitnameListBox.SelectedItem == null) return; PersonalData item = (PersonalData)UnitnameListBox.SelectedItem; DisplayBox.Text = item.name; URLBox.Text = item.url; } } public class Manager { public string subname { get; set; } public string address { get; set; } } public class PersonalData { public string name { get; set; } public string url { get; set; } public List<Manager> manager_list { get; set; } } }

json

[ { "name": "tora", "url": "https:tora.com", "manager_list": [ { "subname": "tiger", "address": "chiba" }, { "subname": "tiger2", "address": "tokyo" } ] }, { "name": "cat", "url": "https:cat.com", "manager_list": [ { "subname": "neko", "address": "kanagawa" }, { "subname": "neko2", "address": "yokohama" } ] } ]

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

SurferOnWww

2022/04/16 11:50

テキストファイルを編集する場合、一旦全部メモリに読み込んで編集し、編集したメモリの内容を丸ごとファイルに上書きするのが普通ですが(メモ帳でやるように)、JSON ファイルもテキストファイルなので同じことになる・・・なんてことは言われなくても分かってます? その方向で考えて実装してはいかがでしょう?
tranokado

2022/04/16 12:40

アドバイスありがとうございます! その方向で実装してみます。他の方の実装方針やアドバイスもお聞きしたいのでこの質問版はこのままにしておきます。自分の方でも進捗ありましたら共有させていただけたらと思います!
SurferOnWww

2022/04/16 13:21

メモ帳でやることを提案しているわけではなくて、もっとスマートにできる方法を検討してアプリを作ることを考えてはいかがと提案したつもりなのですが。(例えば、C# のオブジェクトにデシリアライズし、それを WPF の UI に表示してユーザーに編集してもらい、結果を JSON にシリアライズしてファイルに上書きするとか。インデントされた短い JSON 文字列ならメモ帳の方が簡単かもしれませんが)
tranokado

2022/04/16 13:26

> メモ帳でやることを提案しているわけではなくて すみません自分の伝え方も悪かったですね。 メモ帳でやるようなことをWPFに落とし込んで実装しようと考えていました。 >C# のオブジェクトにデシリアライズし、それを WPF の UI に表示してユーザーに編集してもらい、結果を JSON にシリアライズしてファイルに上書きする まさにこの方針ですね。この方針で実装に励んでみます。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです