Unity3d之json解析研究

 
  json是好东西啊!JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式
      JSON简单易用,我要好好研究一下,和大家共享一下.
      想了解更详细的数据可以参考一下百科:http://baike.baidu.com/view/136475.htm
      好了,我们步入正题:unity3d使用json
      我写了4个方法:ReadJson(),ReadJsonFromTXT();WriteJsonAndPrint(),WriteJsonToFile(string,string).
     想使用JSon需要dll动态链接库
还有一些相应的命名空间using UnityEngine;
using System.Collections;
using LitJson;
using System.IO;
#if UNITY_EDITOR
using UnityEditor;
#endif
首先你需要2个字符串,一个为路径,一个文txt文件。
我的写法如下:
    public TextAsset txt;
    public string filePath;
    public string fileName;
// Use this for initialization
void Start () {
        filePath = Application.dataPath + "/TextFile";
        fileName = filePath + "/File.txt"; 
}

1. //读json数据
    void ReadJson()
    {
        //注意json格式。我的只能在一行写入啊,要不就报错,懂的大牛,不吝赐教啊,这是为什么呢?
        string str = "{'name':'taotao','id':10,'items':[{'itemid':1001,'itemname':'dtao'},{'itemid':1002,'itemname':'test_2'}]}";
        //这里是json解析了
        JsonData jd = JsonMapper.ToObject(str);
        Debug.Log("name=" + jd["name"]);
        Debug.Log("id=" + jd["id"]);
        JsonData jdItems = jd["items"];
        //注意这里不能用枚举foreach,否则会报错的,看到网上
        //有的朋友用枚举,但是我测试过,会报错,我也不太清楚。
        //大家注意一下就好了
        for (int i = 0; i < jdItems.Count; i++)
        {
            Debug.Log("itemid=" + jdItems[i]["itemid"]);
            Debug.Log("itemname=" + jdItems[i]["itemname"]);
        }
        Debug.Log("items is or not array,it's " + jdItems.IsArray);
    }
2.  //从TXT文本里都json
    void ReadJsonFromTXT()
    {
        //解析json
        JsonData jd = JsonMapper.ToObject(txt.text);
        Debug.Log("hp:" + jd["hp"]);
        Debug.Log("mp:" + jd["mp"]);
        JsonData weapon = jd["weapon"];
        //打印一下数组
        for (int i = 0; i < weapon.Count; i++)
        {
            Debug.Log("name="+weapon[i]["name"]);
            Debug.Log("color="+weapon[i]["color"]);
            Debug.Log("durability="+weapon[i]["durability"]);
        }
    }
3.   //写json数据并且打印他
    void WriteJsonAndPrint()
    {
        System.Text.StringBuilder strB = new System.Text.StringBuilder();
        JsonWriter jsWrite = new JsonWriter(strB);
        jsWrite.WriteObjectStart();
        jsWrite.WritePropertyName("Name");
        jsWrite.Write("taotao");
        jsWrite.WritePropertyName("Age");
        jsWrite.Write(25);
        jsWrite.WritePropertyName("MM");
        jsWrite.WriteArrayStart();
        jsWrite.WriteObjectStart();
        jsWrite.WritePropertyName("name");
        jsWrite.Write("xiaomei");
        jsWrite.WritePropertyName("age");
        jsWrite.Write("17");
        jsWrite.WriteObjectEnd();
        jsWrite.WriteObjectStart();
        jsWrite.WritePropertyName("name");
        jsWrite.Write("xiaoli");
        jsWrite.WritePropertyName("age");
        jsWrite.Write("18");
        jsWrite.WriteObjectEnd();
        jsWrite.WriteArrayEnd();
        jsWrite.WriteObjectEnd();
        Debug.Log(strB);
        JsonData jd = JsonMapper.ToObject(strB.ToString());
        Debug.Log("name=" + jd["Name"]);
        Debug.Log("age=" + jd["Age"]);
        JsonData jdItems = jd["MM"];
        for (int i = 0; i < jdItems.Count; i++)
        {
            Debug.Log("MM name=" + jdItems[i]["name"]);
            Debug.Log("MM age=" + jdItems[i]["age"]);
        }

}
4. //把json数据写到文件里
    void WriteJsonToFile(string path,string fileName)
    {
        System.Text.StringBuilder strB = new System.Text.StringBuilder();
        JsonWriter jsWrite = new JsonWriter(strB);
        jsWrite.WriteObjectStart();
        jsWrite.WritePropertyName("Name");
        jsWrite.Write("taotao");
        jsWrite.WritePropertyName("Age");
        jsWrite.Write(25);
        jsWrite.WritePropertyName("MM");
        jsWrite.WriteArrayStart();
        jsWrite.WriteObjectStart();
        jsWrite.WritePropertyName("name");
        jsWrite.Write("xiaomei");
        jsWrite.WritePropertyName("age");
        jsWrite.Write("17");
        jsWrite.WriteObjectEnd();
        jsWrite.WriteObjectStart();
        jsWrite.WritePropertyName("name");
        jsWrite.Write("xiaoli");
        jsWrite.WritePropertyName("age");
        jsWrite.Write("18");
        jsWrite.WriteObjectEnd();
        jsWrite.WriteArrayEnd();
        jsWrite.WriteObjectEnd();
        Debug.Log(strB);
        //创建文件目录
        DirectoryInfo dir = new DirectoryInfo(path);
        if (dir.Exists)
        {
            Debug.Log("This file is already exists");
        }
        else
        {
            Directory.CreateDirectory(path);
            Debug.Log("CreateFile");
#if UNITY_EDITOR
            AssetDatabase.Refresh();
#endif
        }
        //把json数据写到txt里
        StreamWriter sw;
        if (File.Exists(fileName))
        {
            //如果文件存在,那么就向文件继续附加(为了下次写内容不会覆盖上次的内容)
            sw = File.AppendText(fileName);
            Debug.Log("appendText");
        }
        else
        {
            //如果文件不存在则创建文件
            sw = File.CreateText(fileName);
            Debug.Log("createText");
        }
        sw.WriteLine(strB);
        sw.Close();
#if UNITY_EDITOR
        AssetDatabase.Refresh();
#endif

}.
为了大家可以更形象理解一下。我用GUI了
  void OnGUI()
    {
        GUILayout.BeginArea(new Rect(0, 0, Screen.width, Screen.height));
        GUILayout.BeginHorizontal();
        GUILayout.FlexibleSpace();
        GUILayout.BeginVertical();
        GUILayout.FlexibleSpace();
        if (GUILayout.Button("ReadJson"))
        {
            ReadJson();
        }
        if (GUILayout.Button("ReadJsonFromTXT"))
        {
            ReadJsonFromTXT();
        }
        if (GUILayout.Button("WriteJsonAndPrint"))
        {
            WriteJsonAndPrint();
        }
        if (GUILayout.Button("WriteJsonToFile"))
        {
            WriteJsonToFile(filePath,fileName);
        }
        GUILayout.FlexibleSpace();
        GUILayout.EndVertical();
        GUILayout.FlexibleSpace();
        GUILayout.EndHorizontal();
        GUILayout.EndArea();
    }

 
服务器上JSON的内容
[{"people":[
{"name":"fff","pass":"123456","age":"1", "info":{"sex":"man"}},
{"name":"god","pass":"123456","age":"1","info":{"sex":"woman"}},
{"name":"kwok","pass":"123456","age":"1","info":{"sex":"man"}},
{"name":"tom","pass":"123456","age":"1","info":{"sex":"woman"}}
]}
]
复制代码 LoadControl_c代码: using UnityEngine;
using System.Collections;
using LitJson; public class LoadControl_c:MonoBehaviour
{
private GameObject plane; public string url = "http://127.0.0.1/test2.txt"; // Use this for initialization
void Start()
{
StartCoroutine(LoadTextFromUrl()); //StartCoroutine(DoSomething()); //Book book = new Book("Android dep"); //InvokeRepeating("LaunchProjectile", 1, 5);
} IEnumerator DoSomething()
{
yield return new WaitForSeconds(3);
} IEnumerator LoadTextFromUrl()
{
if (url.Length > 0)
{
WWW www = new WWW(url);
yield return www;
//string data = www.data.ToString().Substring(1);
string data = www.text.ToString().Substring(1); // 下面是关键
print(data); LitJson.JsonData jarr = LitJson.JsonMapper.ToObject(www.text); if(jarr.IsArray)
{ for (int i = 0; i < jarr.Count; i++)
{
Debug.Log(jarr[i]["people"]); JsonData jd = jarr[i]["people"]; for(int j = 0; j < jd.Count; j++)
{
Debug.Log(jd[j]["name"]);
}
}
}
}
} }

最新文章

  1. ASP.NET Core 1.0中的管道-中间件模式
  2. shell-bash学习03 别名、日期、函数
  3. maven 打包 spring 项目
  4. ERB预处理ruby代码
  5. Delphi XE的firemonkey获取当前文件所在路径的方法
  6. HQL语句大全(转载)
  7. 拥抱高效、拥抱 Bugtags 之来自用户的声音
  8. Spring MVC 学习笔记(整理)
  9. 【redis】04set类型和zset类型
  10. python学习笔记24(路径与文件 (os.path包, glob包))
  11. uploadify,实际开发案例【选择完文件点击上传才上传】
  12. stripslashes和addslashes的区别
  13. java正則表達式的坑
  14. 一位资深程序员大牛给予Java提升技术的学习路线建议
  15. ##5.2 Nova计算节点-- openstack pike
  16. python序列化pickle/cPickle
  17. vbs编写一个函数,将1001到1050(50串数字)读入test.txt文件。每串数字占一行,不是覆盖。
  18. github提交代码contributions不显示小绿块
  19. C语言 文件的读写操作
  20. JavaScript修改DOM节点时,样式优先级的问题

热门文章

  1. 写给笨蛋徒弟的学习手册(1)——完整C#项目中各个文件含义
  2. python3 filter用法(举例求0~n之间的素数)
  3. 获取ORACLE数据库的构建信息
  4. 【引】runtime全解析,P1:Programming Guide
  5. Ubuntu配置VNC server
  6. 《当心PyCharm里的中文引号陷阱》
  7. input中加入搜索图标
  8. DB2 claim与drain
  9. HttpModule &amp; HttpHandler
  10. 嵌套循环中break、continue的用法