しのぶの日記 (技術編)

2011-03-25

UnityでJSONを扱う

UnityJSONを使うにはいくつか方法があるようですが、今回はLitJSONを使用しました。

f:id:shinobu_siv:20110325213113p:image

Data[] d = JsonMapper.ToObject<Data[]> (www.text);

電気の供給状況に応じて、明かりが変化するゲームらしきものを作ってみました。

当たり前のように使っていた電気ですが、今回、それがいかに素晴らしいことであるかを認識させられました。

震災の被害に合われた方々が、一刻も早くもとのように生活できることを祈っています。

LightTown

f:id:shinobu_siv:20110325221312p:image:w640

  • Json読み込みソース全体
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using LitJson;

public class DataLoader : MonoBehaviour {
   /*
    "saving": false, 
    "hour": 0, 
    "capacity_updated": "2011-03-22 16:05:00", 
    "month": 3, 
    "usage_updated": "2011-03-22 17:05:25", 
    "entryfor": "2011-03-22 15:00:00", 
    "year": 2011, 
    "usage": 2770, 
    "capacity": 3750, 
    "day": 23
    */
    
    int firstYear = 2011;
    int firstMonth = 3;
    
    public string url ="http://tepco-usage-api.appspot.com/";
	
	public List<Data> dataList = new List<Data>();
	
	IEnumerator Start () {
    	System.DateTime dtNow = System.DateTime.Now;
    	System.DateTime dtFirst = new System.DateTime(firstYear, firstMonth, 1);

		while(dtNow >= dtFirst){
		
			string theDate = dtFirst.ToString("yyyy/MM")+".json";
		
			WWW www = new WWW(url+theDate);
			yield return www;
		
			Data[] d = JsonMapper.ToObject<Data[]> (www.text); //Jsonからオブジェクトを復元
			System.Array.Reverse(d); 
			dataList.AddRange(d);
			
			dtNow = dtNow.AddMonths(-1);
		}
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

[System.Serializable]
public class Data {
	public bool saving;
	public int hour;
	public string capacity_updated;
	public int month;
	public string usage_updated;
	public string entryfor;
	public int year;
	public int usage;
	public int capacity;
	public int day;
}

質問です質問です 2012/03/14 00:35 LitJsonで メンバを持つオブジェクトへのマッピングでLong型があると JSONには型情報がないのえ、intでキャストしようとしてエラー・・ になるのは私だけでしょうか・・

shinobu_sivshinobu_siv 2012/03/14 11:08 以前同じ問題に遭遇した記憶があります。intかdoubleで受け取るか、中間的なクラスを作ってintかdoubleかで受け取り、プログラム上でlongに代入するような解決法を取った気がします。LitJson側で対応して欲しい問題ですね。キャストの部分をちょちょいと書き換えてやるのでも行けそうです?

上記の質問したひと上記の質問したひと 2012/03/14 12:32
返信ありがとうございます。
すいません、サポートでもないのに、
丁寧なアドバイスありがとうございました。

結論からいうと
litjsonのそのものを変更して、解決できました。
といっても、かなりのパワープレイで


json_typeがInt inst_typeがlong のときの
if文をベタで書き、その後のマッピング処理に渡す引数を偽装することで
マッピングできたようです。他に問題が発生する可能性もありますが、
とりあえずこれで進める予定です。

jsonReaderの数値解析が、数字ならINTでパースして、だめならLONGでパースみたいになっているので、本当はここをどうにかしたかったのですが、型情報ないし、どうにもなりませんね^^; もしかしたらこのJsonReaderの部分のIntパースをカットして、全てLongでパースさせても、C#の暗黙型変換でOKかもしれません。

C#にNumber型とかあればいいのに・・と思った今日この頃です。

参考になれば幸いです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/shinobu_siv/20110325/1301057486
Connection: close