Profile

Nango

Author:Nango

空がキレイだなぁ

Search

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
-

Comment

Comment Form

Comment Form
管理者にだけ表示を許可する
97

JSONを利用する2 (Unity v3.5)

より良いライブラリ
JSONを利用する1 の続き



今回見たのは MiniJSON JsonFX for Unity の二つ

結論を先に書くと
自作物のデータのような決まった形かつ小さい .json なら MiniJSON //これが一番良いかな
Youtube Data API からの レスポンス のようなデカいのを処理したいなら JsonFX for Unity 使うのが良さそう

LitJSON は最終更新が2007年だし


以下に使い方


MiniJSON
・コメント含めて500行ほどの.csスクリプト1つ
・2012年現在更新中
・クラス用意不要
導入
1) ここ からダウンロードして Project の Plugins へ MiniJSON.cs を入れる
2) フォーラム の頭にあるサンプルをコピペしたスクリプトをゲームオブジェクトに適用して実行
//Twitter Search APIの仕様変更により error が返ってくるようです。それを Deserialize するのもいいかもしれません。
//このスレッドでは、MiniJSON と JsonFx for Unity について少し話し合っていて、アップデートがあれば教えてくれるみたい
2)以下のスクリプトを作成、GameObjectに適応して実行
JsonTester.cs
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using MiniJSON;

public class JsonTester : MonoBehaviour {
List<string> requisiteDataPaths = new List<string>
{
"simple",
"array[1]",
"nest/inside"
};
Hashtable dataTable = new Hashtable{};

void Start()
{
IDictionary sampleSource = new Hashtable()
{
{"simple", "TEST"},
{"array", new long[]{ 0, -99999999999}},
{"nest", new Hashtable
{
{"inside","TREASURE"}
}
}
};

var json = Serialize(sampleSource);
Debug.Log(json);

DeserializeAndFetch(json);

Debug.Log( dataTable["simple"]);
long num = (long)dataTable["array[1]"];
Debug.Log(num);
}

string Serialize(IDictionary source)
{
return Json.Serialize(source);
}

void DeserializeAndFetch(string json)
{
var source = (IDictionary)Json.Deserialize( json);
TraverseFetch(source);
}

void TraverseFetch(IDictionary source, string path=null)
{
path = path==null?"":path+"/";
foreach( var k in source.Keys)
{
string currentPath = string.Format("{0}{1}", path,k);
if( source[k] is IDictionary)//for nest
{
TraverseFetch( (IDictionary)source[k], currentPath);
}
else if( source[k] is IList)//for array
{
var list = (IList)source[k];
for(int i=0; i<list.Count; i++){
FetchElement(currentPath, i, list[i]);
//Debug.Log(string.Format("{0}:[{1}]={2} <{3}>", k, i, list[i], list[i].GetType()));
}
}
else //simple
{
Fetch(currentPath, source[k]);
//Debug.Log(string.Format("{0}:{1} <{2}>", k, source[k], source[k].GetType()));
}
}
}

void FetchElement(string path, int index, object value)
{
Fetch( string.Format("{0}[{1}]",path,index), value);
}

void Fetch( string path, object value)
{
if( !requisiteDataPaths.Contains(path)) return;
object o = null;
if( value is long){
o = (long)value;
} else if ( value is double){
o = (double)value;
} else if ( value is string){
o = value;
}
dataTable.Add(path, o);
}
}



JsonFX for Unity
・UnityPackageでサンプル配布されている//本体は.dll
・2011年末に更新
・LitJSON と同様に読み込む JSON の要素を宣言したクラスを用意する//が、利用したい要素の分だけ用意するだけでよい
導入
1) ここ から JsonFxDemo.unitypackage をダウンロードしてインポート
2) JsonFxDemoシーンを開いて実行






メモ
MiniJSON.cs の中にあるこれ
using (var instance = new Parser(jsonString)) {
return instance.ParseValue();
}
using は勝手に Dispose() してくれるみたい。

C# Tips -usingを使え、使えったら使え(^^)- より
  • Date : 2012-05-16 (Wed)
  • Category : Unity
0

Comment

Comment Form

Comment Form
管理者にだけ表示を許可する
Return to Pagetop
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。