Profile

Nango

Author:Nango

空がキレイだなぁ

Search

スポンサーサイト

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

Comment

Comment Form

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

Json.Net.Unity3DでAbstractClassListをDeserialize

これがやりたかった
環境
- OS: OSX 10.10.4
- Unity: 5.3.1p3


JSON .NET For Unity はAssetStoreで売ってるけどGithubに違うものを発見。

https://github.com/SaladbowlCreative/Json.Net.Unity3D

Releases から落とせる。

一ヶ月ほど前に更新されているので使うことにした。

Baseクラスのリストをjson化するときにConcreteクラスの情報を残したかった。

JsonNetTest.cs
using UnityEngine;
using UnityEditor;
using NUnit.Framework;

namespace Newtonsoft.Json.Test
{
public class JsonNetTest
{
[Test]
public void TypeNameHandlingTest()
{
var array = new Human[]{
new Neet{ name = "a" },
new Worker{ name = "Heribert Ara", task = 9999 }
};

var settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
};

string json = JsonConvert.SerializeObject(array, settings);

var deserialized = JsonConvert.DeserializeObject<Human[]>(json, settings);

Assert.AreEqual(typeof(Neet), deserialized[0].GetType(), "neet");
Assert.AreEqual(9999, (deserialized[1] as Worker).task, "task");
/* Debug.Log(json); */
}
}

public abstract class Human
{
public string name;
}

public class Neet : Human
{

}

public class Worker : Human
{
public int task;
}
}


json
[
{
"$type": "Newtonsoft.Json.Test.Neet, Assembly-CSharp-Editor",
"name": "a"
},
{
"$type": "Newtonsoft.Json.Test.Worker, Assembly-CSharp-Editor",
"task": 9999,
"name": "Heribert Ara"
}
]


TypeNameHandling = TypeNameHandling.Auto のおかげで必要なところだけType情報が付加されている。
動作確認は一々シーン開くのが面倒なのでTestで行うといいと思う。
(UnityEditor メニューの Window/Editor Tests Runnerから実行)
  • Date : 2016-02-22 (Mon)
  • Category : Unity
0

Comment

Comment Form

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