teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

コードの明らかな間違いを修正

2019/06/14 08:52

投稿

gentaro
gentaro

スコア8947

answer CHANGED
@@ -22,10 +22,10 @@
22
22
 
23
23
  例えば
24
24
  ```C#
25
- public JSonDataFileReader {
25
+ public class JSonDataFileReader {
26
26
  public IEnumerable<Entry> Load(string filename) {
27
27
  var data = File.ReadAllText(filename);
28
-    var result = new List<Entry>();
28
+ var result = new List<Entry>();
29
29
  // ループ: dataの中身を正規表現を使って1画面分ずつマッチさせる
30
30
  var viewname = // 画面名に該当する要素を正規表現で取り出す
31
31
  // ループ: マッチさせた1画面分の文字列から、各要素ごとにマッチさせる

1

変更

2019/06/14 08:52

投稿

gentaro
gentaro

スコア8947

answer CHANGED
@@ -1,30 +1,44 @@
1
- > どのようにすれば、
2
- > 画面┳キー━文言
3
- > ┳キー━文言
4
- > ┗キー━文言
5
- > ように切分け、メモリ上で編集するこが可能になるでょうか
1
+ 質問欄りとりを見て回答を変更ます
6
2
 
3
+ 最終的にやりたいのは
4
+ 1. JSON形式のテキストファイルを読み込む
7
- いまいち内容が掴めてませが、質問内容に書かれていることをストレート受け取
5
+ 2. 読み込だデータは「画面名-項目名-現地語のテキスト」の形式として編集できるよう
6
+ 3. JSON形式のテキストファイルとして書き出す
8
7
 
8
+ という話みたいなので、2の部分は
9
+ ```C#
10
+ public class Entry {
11
+ pubilc string ViewName { get; set;}
12
+ pubilc string ItemName { get; set;}
13
+ pubilc string Text { get; set;}
14
+ }
15
+ ```
9
- 1.JSONのデシリアライズには成功してる(画面ごとに異るクラor構造体があるんだろう…)
16
+ みたいなやつを`List<Entry>`みたいにリトに突っ込で扱えれば十分と思います。
10
- 2.項目名は増える可能性がある(つまり1のクラス・構造体のメンバが増える)
11
- 3.画面単位で key-value のリスト(つまりDictionary)で読み込みたい(この部分は2の変更があっても修正せずに済むようにしたい)
12
17
 
13
- いうことあれば1で読み込んだオブジェクトな構造体のプロパティ・フィールドをリフレクョンを使ってMemberInfoを取得、(オブジェクトそのものか MemberInfo.Name かわかません)それをキーにして、Dictiorayに突っ込む形にな気がします。
18
+ 問題は13すがこれを無理やJSONデシアライズ・リアライズでやろうとているあたりが苦労してポイントだと思います。
14
19
 
20
+ Zuishinさんがコメントされていたとおり、JSONはただのテキストファイルです。
15
- やりたい割にかな微妙な方法だと思いますし自分ではやりですが、詳細な利用法(制限等)がわからないとこれぐらいしか思いつきません…
21
+ れを読み込んで、上記クラスのインスタンスが作れたり、書き出せりすれば十分はずです。
16
22
 
23
+ 例えば
24
+ ```C#
25
+ public JSonDataFileReader {
26
+ public IEnumerable<Entry> Load(string filename) {
27
+ var data = File.ReadAllText(filename);
28
+    var result = new List<Entry>();
29
+ // ループ: dataの中身を正規表現を使って1画面分ずつマッチさせる
30
+ var viewname = // 画面名に該当する要素を正規表現で取り出す
31
+ // ループ: マッチさせた1画面分の文字列から、各要素ごとにマッチさせる
32
+ var obj = new Entry {
33
+ ViewName = viewName,
34
+ ItemName = // 項目名に該当する要素を正規表現で取り出す
35
+ Text = // テキストに該当する要素を正規表現で取り出す
36
+ };
37
+ result.Add(obj);
17
38
 
18
- 以下、質問に対する直接的な回答ではないので、
39
+ return result;
40
+ }
41
+ }
42
+ ```
19
43
 
20
- > VS2008、Frameworkは3.5、文言はjson形式で管理する方式で決まっています。
21
-
22
- この辺に何らかの深事情があるのら無視して欲しいですが…
44
+ みたいな感じ読めまよね。(書き出す方は省略)
23
-
24
- VB.NETの経験があればご存知だと思いますので、なぜそう決まったのかわからないのですが、.NETで多言語対応する時の標準的なやり方はResourceファイルを使う方法なので、そこで苦労するぐらいなら最初から key-value の形でkeyを「画面名_項目名」とかにしてResourceファイルにゴリゴリ書いた方が良いような気がします。
25
-
26
- コメントもつけられるから、キー名だけで分かりづらくても意図は伝えられるので、管理上もメリットがありますし。(今の形式のJSONだと開発者=翻訳者じゃないと辛そう)
27
-
28
- Visual Studioのリソースエディタ画面の内容をそのままExcelやテキストエディタ等に相互にコピペできますので、開発者≠翻訳者になった場合に、作業をお願いする時にも都合が良い気がします。
29
-
30
- JSONがすでに作成済みだったり、何らかのシステムで吐き出されるものだとしても、テキストエディタ使って文字列置換すれば表形式に変更するのは秒殺でできるので、可能ならちょっと思い直した方が良い気がします。