LitJson如何使用?
在github上有項目網址,下載新的release版本(新版支持序列化字典,以及更多類型)。鏈接:https://github.com/LitJSON/litjson/releases
在Unity中創建Plugins文件夾,把下好的dll文件放入到Plugins文件夾中既可以了。
LitJson支持什么類型?
支持C#中幾乎所有的類型。
但Unity中的例如Vector2、3,Quaternion以及Matrix4x4等。
如何去支持它們?
首先看最簡單的情況
支持自定義類的序列化
序列化自定義類:
public class Custom
{
public int data1;
public float data2;
public Custom(int data1, float data2)
{
this.data1 = data1;
this.data2 = data2;
}
}
void Start()
{
List<Custom> list = new List<Custom>();
list.Add(new Custom(1, 2.0f));
list.Add(new Custom(2, 3.0f));
print(JsonMapper.ToJson(list));
}
輸出如下:

序列化自定義類必須要求類里面類型要是LitJson支持的。那么如果碰到比如Vector2這種不支持的類型該怎么辦呢?馬上就講解。
序列化Vector2類型:
先說一句,LitJson的擴展性很強,在你自己實現自定義解析方案的情況下,LitJson可以支持任何類型。
自己實現類型解析
void Start()
{
Action<Vector2,JsonWriter> writeVector2 = (v,w) => {
w.WriteObjectStart();//開始寫入對象
w.WritePropertyName("x");//寫入屬性名
w.Write(v.x.ToString());//寫入值
w.WritePropertyName("y");
w.Write(v.y.ToString());
w.WriteObjectEnd();
};
JsonMapper.RegisterExporter<Vector2>((v,w) => {
writeVector2(v,w);
});
//在上面注冊了自定義的解析方式,當碰到Vector2類型時LitJson就知道該怎么辦了
string listJson = List_Vector2Serialized();
print(listJson);
var l =List_Vector2DesSerialized(listJson);
foreach (var item in l)
{
print(item.x+" "+item.y);
}
}
/// <summary>
/// List<Vector2> 序列化測試
/// </summary>
private string List_Vector2Serialized()
{
string str;
List<Vector2> list = new List<Vector2>();
list.Add(new Vector2(1,1));
list.Add(new Vector2(2, 2));
str = JsonMapper.ToJson(list);
return str;
}
輸出如下:

會了序列化,那么反序列也就很簡單了。下面只簡單實現一下Vector2類型的反序列化。
Vector2類型的反序列化:
void Start()
{
Action<Vector2,JsonWriter> writeVector2 = (v,w) => {
w.WriteObjectStart();//開始寫入對象
w.WritePropertyName("x");//寫入屬性名
w.Write(v.x.ToString());//寫入值
w.WritePropertyName("y");
w.Write(v.y.ToString());
w.WriteObjectEnd();
};
JsonMapper.RegisterExporter<Vector2>((v,w) => {
writeVector2(v,w);
});
//在上面注冊了自定義的解析方式,當碰到Vector2類型時LitJson就知道該怎么辦了
string listJson = List_Vector2Serialized();
print(listJson);
var l =List_Vector2DesSerialized(listJson);
foreach (var item in l)
{
print(item.x+" "+item.y);
}
}
/// <summary>
/// List<Vector2> 序列化測試
/// </summary>
private string List_Vector2Serialized()
{
string str;
List<Vector2> list = new List<Vector2>();
list.Add(new Vector2(1,1));
list.Add(new Vector2(2, 2));
str = JsonMapper.ToJson(list);
return str;
}
/// <summary>
/// List<Vector2> 反序列化測試
/// </summary>
private List<Vector2> List_Vector2DesSerialized(string json)
{
int i = 1;
JsonData js = JsonMapper.ToObject(json);
List<Vector2> list=new List<Vector2>();
foreach (JsonData item in js)
{
//print(item.ToString());
list.Add(new Vector2(int.Parse(item["x"].ToString()),int.Parse(item["y"].ToString())));
}
return list;
}
結果如下:

更多的自定義方式:
靈活度很高,大家想怎么定義就用什么定義。如下我展示Vector3的序列化與反序列化(開發中未必有意義,只是為了展示它的靈活度)
void Start()
{
Action<Vector3,JsonWriter> writeVector3 = (v,w) => {
w.WriteObjectStart();
w.WritePropertyName("valueData");
w.WriteArrayStart();
w.Write(v.x);
w.Write(v.y);
w.Write(v.z);
w.WriteArrayEnd();
w.WriteObjectEnd();
};
JsonMapper.RegisterExporter<Vector3>((v, w) => { writeVector3(v, w); });
string listJson1 = List_Vector3Serialized();
print(listJson1);
List_Vector3DesSerialized(listJson1);
}
/// <summary>
/// List<Vector3> 序列化測試
/// </summary>
/// <returns></returns>
private string List_Vector3Serialized()
{
string str;
List<Vector3> list = new List<Vector3>();
list.Add(new Vector3(1, 2, 3));
list.Add(new Vector3(4, 5, 6));
str = JsonMapper.ToJson(list);
return str;
}
/// <summary>
/// List<Vector3> 反序列化測試
/// </summary>
/// <param name="json"></param>
private void List_Vector3DesSerialized(string json)
{
JsonData js = JsonMapper.ToObject(json);
List<Vector3> list = new List<Vector3>();
foreach (JsonData item in js)
{
foreach (JsonData data in item["valueData"])
{
print(data.ToString());
}
}
}
結果如下:

新版的LitJson已經支持序列化字典了,這里就不演示了。如果需要實現的話,還是參考如上的方式,舉一反三。
