zoukankan      html  css  js  c++  java
  • Unity3d之json解析研究

    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"]);
    }
    }
    }
    }
    }
    
    }
    
  • 相关阅读:
    20151216JqueryUI---dialog代码备份
    20151215jqueryUI--dialog代码备份
    20151215jquery学习笔记--jqueryUI --dialog(对话框)
    20151214 jquery插件代码备份
    20151213Jquery学习笔记--插件
    javaweb常用工具类及配置文件备份
    Javaweb常用工具类及配置文件备份
    20151212Jquery 工具函数代码备份
    20151212jquery学习笔记--工具函数
    CF976E Well played!
  • 原文地址:https://www.cnblogs.com/ADaii/p/4218410.html
Copyright © 2011-2022 走看看