その気持ち、とてもよくわかります!
そもそもFugaClassを定義しているのは、C#のJsonパーサーがクラスのインスタンスを作ってくれる方式だからですよね。
もしフィールド名だけで値を取得できれば、Jsonのデシリアライズのためだけに無駄なクラスを作る必要はないのに!
そんなときはこちらをお勧めします。
https://github.com/mtschoen/JSONObject
Unity用ですが、JsonObject.csのみで動くので、Unity以外でも使用することができます。
ライセンスはMITです。スクリプト内に記載されているので目を通しておきましょう。
使用方法は以下のような形式です。
変数名が気持ち悪かったり、DateTime型へのパースが多かったりするならば自作クラスでラップしましょう。
var jsonObj = new JSONObject(jsonText);
string name= jsonObj.GetField("name").str;
int age = (int)jsonObj.GetField("age").i;
float weight = jsonObj.GetField("weight").f;
追記:
問題の本質は「Jsonのシリアライズ/デシリアライズをすっきり書きたい」ことであり、「匿名クラスを定義したい」ことではないと思います。
上記の解決策が最善とは限りませんが、
・問題の本質
・現在採用している、もしくは採用したいと思っている手段
・上記手段の問題点
を分けて考えるとより回答が付きやすくなるかと思います。
ご参考までに!
さらに追記:
上記のスクリプトを使わせてもらう場合、ラップした方が使いやすいと思うので例を載せておきます。
// ラップ例
public class JsonReader
{
JSONObject jsonObject;
public JsonReader(string jsonText)
{
this.jsonObject = new JSONObject(jsonText);
}
// 内部的に使います。指定したキーが存在しなければ例外を発生させています。
JSONObject GetField(string key)
{
if (!jsonObject.HasField(key)) {
var message = "Jsonオブジェクトにキー[" + key + "]が見つかりませんでした。";
throw new KeyNotFoundException(message);
}
return jsonObject.GetField(key);
}
public string GetString(string key)
{
return GetField(key).str;
}
public int GetInt(string key)
{
return (int)GetField(key).i;
}
// 基本型以外もすきな方法で取得できます。
public DateTime GetDateTime(string key)
{
var dateTimeString = GetString(key);
DateTime result;
if (!DateTime.TryParse(dateTimeString, out result)) {
var message = "文字列「" + dateTimeString + "」を日付時間型に変換できませんでした。";
throw new ArgumentException(message);
}
return result;
}
public DateTime GetDate(string key)
{
return GetDateTime(key).Date;
}
}
// 使用例
public class Hoge
{
// テストのために適当なJsonを読み込ませておく
JsonReader fuga = new JsonReader("{\"name\": \"名前\", \"birthday\": \"1956-07-08\"}");
public string Name {
get { return fuga.GetString("name"); }
}
public DateTime BirthDay {
get { return fuga.GetDate("birthday"); }
}
public int Age {
get {
var birthday = this.BirthDay;
var today = DateTime.Today;
var age = today.Year - birthday.Year;
return age - (birthday > today.AddYears(age) ? 1 : 0);
}
}
}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/26 02:59
2018/01/26 07:52