1.什么是Json?
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
2.JSON 语法规则
–数据在键值对中
–数据由逗号分隔
–花括号保存对象
–方括号保存数组
3.Json的结构
–对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,…}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。
–数组:数组在js中是中括号“[]”括起来的内容,数据结构为 [“java”,“javascript”,“vb”,…],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。
4.Json在Unity3d中的使用
1. JsonUtility
JsonUtility.FromJson():把json字符串转成对象.
JsonUtility.ToJson():把对象转成json字符串.
JsonUtility
[Serializable]
public class Person{
public string name;
public int age;
}
public class Persons{
public Person[] persons;
}
public class JsonUtilityDemo:MonoBehaviour{
void Start(){
//使用代码生成一个json
//{'name':'李逍遥','age':25}
Person p1 = new Person();
p1.name = "李逍遥";
p1.age = 25;
string jsonStr = JsonUtility.ToJson(p1);
//Debug.Log(jsonStr);
//{'persons':[{'name':'李逍遥','age':25},{'name':'王小虎','age':7}]}
Person p2 = new Person();
p1.name = "王小虎";
p1.age = 7;
Person[] ps = new Person[]{p1,p2};
Persons persons = new Persons();
persons.persons = ps;
string jsonStr = JsonUtility.ToJson(persons);
//Debug.Log(jsonStr);
//解析Json
//{'persons':[{'name':'李逍遥','age':25},{'name':'王小虎','age':7}]}
Persons newPersons = JsonUtility.FromJson<Persons>(jsonStr);
Debug.Log(newPersons.persons[0].name);
}
}
2/. LitJson:
LitJson是一个Json的开源项目,这个比较稳定,推荐使用,官网:http://lbv.github.io/litjson/下载LitJson.dll(没有vpn的亲:链接:http://pan.baidu.com/s/1i57ozml 密码:eyd4)
JsonMapper.ToObject():把json字符串转成对象.
JsonMapper.ToJson():把对象转成json字符串.
使用时,dll文件要放在Plugins文件夹下,代码访问时要引用命名空间:using LitJson;
示例代码:
1/ 解析json:
public void ResolveJson()
{
//定义的JSON字符串,注意JSON的格式
string str = @"
{
""Name"" : ""yusong"",
""Age"" : 26,
""Birthday"" : ""1986-11-21"",
""Thumbnail"":[
{
""Url"": ""http://xuanyusong.com"",
""Height"": 256,
""Width"": ""200""
},
{
""Url"": ""http://baidu.com"",
""Height"": 1024,
""Width"": ""500""
}
]
}";
//这里是解析,包括整形与字符串
JsonData jd = JsonMapper.ToObject(str);
Debug.Log("name = " + (string)jd["Name"]);
Debug.Log("Age = " + (int)jd["Age"]);
Debug.Log("Birthday = " + (string)jd["Birthday"]);
JsonData jdItems = jd["Thumbnail"];
for (int i = 0; i < jdItems.Count; i++)
{
Debug.Log("URL = " + jdItems[i]["Url"]);
Debug.Log("Height = " + (int)jdItems[i]["Height"]);
Debug.Log("Width = " + jdItems[i]["Width"]);
}
}
运行结果:
2.合成json:
public void MergerJson()
{
StringBuilder sb = new StringBuilder ();
JsonWriter writer = new JsonWriter (sb);
writer.WriteObjectStart ();
writer.WritePropertyName ("Name");
writer.Write ("yusong");
writer.WritePropertyName ("Age");
writer.Write (26);
writer.WritePropertyName ("Girl");
writer.WriteArrayStart ();
writer.WriteObjectStart();
writer.WritePropertyName("name");
writer.Write("ruoruo");
writer.WritePropertyName("age");
writer.Write(24);
writer.WriteObjectEnd ();
writer.WriteObjectStart();
writer.WritePropertyName("name");
writer.Write("momo");
writer.WritePropertyName("age");
writer.Write(26);
writer.WriteObjectEnd ();
writer.WriteArrayEnd();
writer.WriteObjectEnd ();
Debug.Log(sb.ToString ());
JsonData jd = JsonMapper.ToObject(sb.ToString ());
Debug.Log("name = " + (string)jd["Name"]);
Debug.Log("Age = " + (int)jd["Age"]);
JsonData jdItems = jd["Girl"];
for (int i = 0; i < jdItems.Count; i++)
{
Debug.Log("Girl name = " + jdItems[i]["name"]);
Debug.Log("Girl age = " + (int)jdItems[i]["age"]);
}
}
结果:
注意:
使用LitJson解析时,解析类时
若包含Dictionary结构,则key的类型必须是string,而不能是int类型(如需表示id等),否则无法正确解析!
若需要小数,要使用double类型,而不能使用float,可后期在代码里再显式转换为float类型。