码迷,mamicode.com
首页 > Web开发 > 详细

数据存储与读取——02JSON

时间:2015-11-04 07:04:14      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:

学习笔记适合新手,如有错误请指正。?号处也请各位指点下,谢谢。

JSON是一种轻量级的数据交换和存储格式。

可用于对数据的设备(如手机的本地存储)和向Web服务器上传

并且符合面向对象编程思想

JSON数据格式

书写格式是:名称/值,如“name”,“张三”

JSON基本结构:

1.对象:用{}包裹,用名称/值来表示对象中的一个属性

public class Person
{
    public string name;
    public int age;
    public Person(string _name,int _age)
    {
        name = _name;
        age = _age;
    }
}

对象persong john=new person("John",19);用JSON表示就是{"name":"John","Johb":"19"}

数组

用[] 包裹,用“,”表示并列关系,如:

{“people”:[{"name":"John","age":"19"},{"name":"Tom","age":"18"}]}

JsonFx是一个类对象和JSON数据相互转换的动态链接库,网上有很多这样的库

在代码清单10-1中定义了person类,在代码清单10-2中创建对象John,再将John转成JSON字符串,然后将JSON字符串转换回Person对象

代码清单10-1

public class Person
{
    public string name;
    public int age;
    public Person(string _name,int _age)
    {
        name = _name;
        age = _age;
    }
}

代码清单10-2

using UnityEngine;
using System.Collections;
using JsonFx.Json;

public class C_10_2_1 : MonoBehaviour {
    void Start () {
        Person john = new Person("John",19);
        //将对象序列化成JSON字符串
        string Json_Text = JsonWriter.Serialize(john);
        Debug.Log(Json_Text);
        //将JSON字符串反序列化成对象
        john = JsonReader.Deserialize(Json_Text) as Person;
    }
}

?:

1:Person john = new Person("John",19);我理解为:声明数组

2:string Json_Text = JsonWriter.Serialize(john);我理解为:就是字符串转化,为了便于输出

3:john = JsonReader.Deserialize(Json_Text) as Person;这个我理解为再把字符串转化成person,这里反序列化是什么鬼?百度一下如下,但是还有个疑问这里反序列化对象这是要干嘛?

把对象转换为字节序列的过程称为对象的序列化
把字节序列恢复为对象的过程称为对象的反序列化

以上理解有错的地方,请各位大神指点出来

数据存储

Unity使用的Mono是跨平台的,符合.Net框架

我们可以使用System.IO下的File.ReadAllText()和File.WriteAllText()这两个函数来实现数据的存储

得到存储路径,代码如下:

public static string GetDataPath()
    {
        if (Application.platform == RuntimePlatform.IPhonePlayer)
        {
            //Iphone路径
            string path = Application.dataPath.Substring(0, Application.dataPath.Length - 5);
            path = path.Substring(0, path.LastIndexOf(/));
            return path + "/Documents";
        }
        else
        {
            if (Application.platform == RuntimePlatform.Android)
            {
                //安卓路径
                return Application.persistentDataPath + "/";
            }
            else
            { 
                //其他路径
                return Application.dataPath;//数据文件夹路径
            }
        }
    }

最后一步,将JSON数据写到该路径:

File.WriteAllText(GetDataPath() + "/" + "FileName", Json_Text);

数据存储功能的完整代码如下:

using UnityEngine;
using System.Collections;
using JsonFx.Json;
using System.IO;

public class C_10_2_2 : MonoBehaviour {
    string path =  "/Chapter8/8.2/data.txt";
    void OnGUI () {
        if(GUILayout.Button("保存"))
        {
            Write();
        }
        if(GUILayout.Button("读取"))
        {
            Read();
        }
    }
    void Write()//保存
    {
        Person john = new Person("John",19);
        string Json_Text = JsonWriter.Serialize(john);
        File.WriteAllText (GetDataPath () +path, Json_Text);
    }
    void Read()//读取
    {
        string Json_Text = File.ReadAllText (GetDataPath () +path);
        Person john = JsonReader.Deserialize<Person>(Json_Text);
        Debug.Log(john.name +"‘s age is "+john.age);
    }
    public static string GetDataPath ()
    {
        if (Application.platform == RuntimePlatform.IPhonePlayer) {
            //iphone路径
            string path = Application.dataPath.Substring (0, Application.dataPath.Length - 5); 
            path = path.Substring (0, path.LastIndexOf (/));  
            return path + "/Documents";
        } else if (Application.platform == RuntimePlatform.Android) {
            //安卓路径
            return Application.persistentDataPath + "/";
        } else
        {
            //其他路径
            return Application.dataPath;
        }
    }
}

运行,先点击保存按钮,刷新(Ctrl+r),发现在文件1.2.2下多了刚在保存的data.Text文件,并且可以看到里边内容,点击读取,看见控制台输出“John‘s age is 19”

数据加密

打开data.Text文件可以看到文本内容十分不安全,需要对文本加密

加密的算法有很多,如RC2、RC4等,这里使用Rijidael算法

Rijndael是.NET里包含的一个加密接口,在加密和解密是都使用相同的秘钥,位于System.Security.Crytography命名空间下,Rijindael算法符合AES堆成密码标准,秘钥长度为128、192、256位之一

加密步骤如下:

1.设置字符串秘钥并转化为byte数组,这里使用32的字符串转化为长度为32的byte数组,也就是256位的秘钥

start string key="1221321321321321213";

byte[] keyArray=UTF8Encoding.UTF8.GetBytes(key);

2.创建RijndaelManaged对象并设置参数

RijndaelManaged rDel=new RijndaelManaged();

rDel.Key=keyArray;

rDel.Mode=CipherMode.ECB;

rDel.Padding=PaddingMode.PKCS7;

ICryptoTransform cTransform=rDel.CreateEncryptor();

3.加密

//将原始字符串转化成byte数组

byte[] toEncryptArray=UTF8Encoding.UTF8.GetBytes("content");

//加密

byte[] resultArray=cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Lenght);

//转换回字符串并返回

return Convert.ToBase64String(resultArray,0,resultArray.Length);

解密步骤如下:

1和加密共用同样的秘钥

2创建RijndaelManaged对象并设置参数,和加密的第二步一致

3解密

//将加密后的字符串转化成byte数组

byte[] toEncryptArry=Convert.FromBase64String(toD);

//解密

byte[] resultArray=cTransform.TransformFinalBlock(toEncryptArray,0,toEncryptArray.Length);

//转换回字符串并返回

return UTF8Encoding.UTF8.GetString(resultArray);

整个字符串加密与解密代码如下:

using UnityEngine;
using System;
using System.Text;
using System.Collections;
using System.Security.Cryptography;

public class C_10_2_3{
    static string key = "12348578902223367877723456789012";
    /// <summary>
    /// 字符串加密
    /// </summary>
    private static string Encrypt (string toE)
    {
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes (key);
        
        RijndaelManaged rDel = new RijndaelManaged ();
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.ECB;
        rDel.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = rDel.CreateEncryptor ();
        
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes (toE);
        byte[] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
        
        return Convert.ToBase64String (resultArray, 0, resultArray.Length);
    }
    /// <summary>
    /// 字符串解密
    /// </summary>
    private static string Decrypt (string toD)
    {
        byte[] keyArray = UTF8Encoding.UTF8.GetBytes (key);
        
        RijndaelManaged rDel = new RijndaelManaged ();
        rDel.Key = keyArray;
        rDel.Mode = CipherMode.ECB;
        rDel.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = rDel.CreateDecryptor ();
        
        byte[] toEncryptArray = Convert.FromBase64String (toD);
        byte[] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
        
        return UTF8Encoding.UTF8.GetString (resultArray);
    }
}

数据存储与读取——02JSON

标签:

原文地址:http://www.cnblogs.com/kubll/p/4934916.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!