unity +动态写本地Json
存储本地json,解决中文乱码问题 TKCreateJson .cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using System.IO;
using System.Text;
using UnityEditor;
using System;
using System.Text.RegularExpressions;
public class TKCreateJson : MonoBehaviour
{
public static TKCreateJson TKCreateJsonInstance;
StringBuilder stringBuilder ;
JsonData TKJsonData;
JsonMapper tkJsonMapper;
JsonWriter jw;
string jsonStr;
static string path;
static string testFileName="jsonFile";
public string TestName;
// Use this for initialization
void Start ()
{
TKJsonData = new JsonData();
stringBuilder = new StringBuilder();
jw = new JsonWriter(stringBuilder);
//for (int i = 0; i < 10; i++)
//{
// TKGameSaveDataStatus.singleton.checkSteps[i].itemID=i;
//}
TKGameSaveDataStatus.singleton.equiName = "小明";
TKGameSaveDataStatus.singleton.equipID = 1;
TKGameSaveDataStatus.singleton.equipType = "你好";
path = Application.persistentDataPath + "/json/";
}
private void Awake()
{
TKCreateJsonInstance = this;
}
//方法1写入json Success
public void OnCreateTKVisitDataTest()
{
//TKJsonData["Device"] = TestName;
TKJsonData["deviceName"] = TKGameSaveDataStatus.singleton.equiName;
TKJsonData["deviceID"] = TKGameSaveDataStatus.singleton.equipID;
TKJsonData["deviceType"] = TKGameSaveDataStatus.singleton.equipType;
jsonStr = TKJsonData.ToJson();
ParsingCompostieJson();
//OnJsonMapper();
//OnCreateJson();
Debug.Log(Application.persistentDataPath);
}
//项目正式运用,解决项目乱码问题
public void OnCreateTKVisitData()
{
jw.WriteObjectStart();
jw.WritePropertyName("deviceName");
jw.Write(TKGameSaveDataStatus.singleton.equiName);
jw.WritePropertyName("deviceID");
jw.Write(TKGameSaveDataStatus.singleton.equipID);
jw.WritePropertyName("deviceType");
jw.Write(TKGameSaveDataStatus.singleton.equipType);
jw.WritePropertyName("checkStep");
jw.WriteArrayStart();
foreach (var item in TKGameSaveDataStatus.singleton.CheckStepDicyionary.Values)
//foreach (var item in TKGameSaveDataStatus.singleton.checkSteps)
{
jw.WriteObjectStart();
jw.WritePropertyName("id");
jw.Write(item.itemID);
jw.WritePropertyName("partID");
jw.Write(item.partID);
jw.WritePropertyName("itemValue");
jw.Write(item.itemValue);
jw.WriteObjectEnd();
}
jw.WriteArrayEnd();
jw.WriteObjectEnd();
//1解决中文问题
string str = stringBuilder.ToString();
Regex reg = new Regex(@"(?i)\\[uU]([0-9a-f]{4})");
string modifyString = reg.Replace(str,delegate (Match m) { return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString(); });
string data = modifyString.Replace("\\", "");
Debug.Log("正则修改后"+data);
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
FileStream file = new FileStream(path+"tkkkk222.json",FileMode.Create);
byte[] bts = System.Text.Encoding.UTF8.GetBytes(data);
file.Write(bts,0,bts.Length);
//关闭文件流
if (file != null)
{
file.Close();
}
////2 中文乱码
//FileStream fileStream = new FileStream(path+"TKJson.json",FileMode.OpenOrCreate,FileAccess.Write,FileShare.ReadWrite);
//StreamWriter streamWriter = new StreamWriter(fileStream);
//streamWriter.WriteLine(stringBuilder.ToString());
//streamWriter.Close();
//fileStream.Close();
//fileStream.Dispose();
}
void ParsingCompostieJson()
{
//JsonData jsonData = JsonMapper.ToObject(jsonStr);
SaveToJson(jsonStr);
}
//方法2解决中文问题
public static void SaveToJson(JsonData jsondata)
{
string str = jsondata.ToJson();
Regex reg = new Regex(@"(?i)\\[uU]([0-9a-f]{4})");
string modifyString = reg.Replace(str,delegate (Match m) { return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString(); });
string data = modifyString.Replace("\\", "");
Debug.Log("正则修改后"+data);
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
FileStream file = new FileStream(path+"222.json",FileMode.Create);
//File.WriteAllText(path+"666.json",modifyString);
byte[] bts = System.Text.Encoding.UTF8.GetBytes(data);
file.Write(bts,0,bts.Length);
//关闭文件流
if (file != null)
{
file.Close();
}
}
//方法3中文乱码
public void OnJsonMapper()
{
TKGameSaveDataStatus.singleton.equiName = "马化腾";
TKGameSaveDataStatus.singleton.equipID = 999;
TKGameSaveDataStatus.singleton.equipType = "6666666";
string sr = JsonMapper.ToJson(TKGameSaveDataStatus.singleton);
StreamWriter sw;
FileInfo fi = new FileInfo(path+"888666.json");
if (fi.Exists)
{
fi.Delete();
}
sw = fi.CreateText();
sw.Write(sr);
sw.Close();
AssetDatabase.Refresh();
}
//方法3直接创建中文乱码
private void OnCreateJson()
{
File.WriteAllText(path + "No888.json", jsonStr);
StreamWriter sw;
FileInfo fi = new FileInfo(path);
if (fi.Exists)
{
fi.Delete();
}
sw = fi.CreateText();
sw.Write(jsonStr);
sw.Close();
AssetDatabase.Refresh();
}
// Update is called once per frame
void Update ()
{
//if (Input.GetKeyDown(KeyCode.A))
//{
// OnCreateTKVisitDataTest();
//}
}
}
Singleton.cs
public class Singleton<T> where T :class,new()
{
private static T s_singleton = default(T);
private static object s_objectLock = new object();
public static T singleton
{
get
{
if (s_singleton == null)
{
lock (s_objectLock)
{
if (s_singleton == null)
{
s_singleton = new T();
}
}
}
return Singleton<T>.s_singleton;
}
}
protected Singleton()
{
}
}
TKGameSaveDataStatus.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TKGameSaveDataStatus:Singleton<TKGameSaveDataStatus>
{
public string equiName;
public int equipID;
public string equipType;
public int id;
public int partID;
public string itemValue;
//public List< CheckStep> checkSteps;
public Dictionary<int,CheckStep> CheckStepDicyionary;
}
public class CheckStep
{
public int itemID;
public int partID;
public string itemValue;
}
储存每个步骤的信息 TKDeviceInformationManager .cs
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class TKDeviceInformationManager : TKUIManager
{
public Text DeviceEquipNameText;//设备名称
public Text DeviceGradeText;//设备等级
public Text DeviceDescribeText;//设备描述
public Text DeviceLayoutText;//设备布置情况
//选择
public Button VisitInformationButton;//设备资料
public Button MapFileButton;//走访信息
public Button CaptureButton;//视频、拍照
public Button SoundRecordingButton;//录音
public Button CheckButton;//校对
public GameObject VisitInformationPanel;
public GameObject DeviceDataPanel;
//设备走访内容记录
private Toggle YesToggle;
private Toggle NoToggle;
private Toggle UnKnowToggle;
private Toggle NotApplicableToggle;
//设备走访标题
public GameObject CreateVisitPartsTitleObj;
public RectTransform VisitPartTitleParentObject;
public Button btn_CreateVisitTitle;
public int VisitTitleListBtnNum;
public List<Button> Btn_CurrentVisitTitleList;
Image btn_CreateVisitTitleImage;
//设备走访内容
public RectTransform VisitContentParent;
public RectTransform CurrentVisitContentItem;
public int CurrentVisitContentNum;
public GameObject CurrentVisitContentObj;
private Button VisitProblemText;
public List<GameObject> CurrentVisitContentItemList;
// Use this for initialization
void Start()
{
OnInit();
//SetDeviceInformation(0);
StartCoroutine(GetVisitInformation("Btn_InformationTitle", VisitPartTitleParentObject));
//TKGameSaveDataStatus.singleton.checkSteps = new List<CheckStep>();
TKGameSaveDataStatus.singleton.CheckStepDicyionary = new Dictionary<int, CheckStep>();
}
//根据数据创建走访信息列表
IEnumerator GetVisitInformation(string ObjName, RectTransform pathButtonPool)
{
yield return new WaitForSeconds(0.2f);
if (TKDataHandle.TKDataHandleInstance.currentWorkform != null)
{
if (TKDataHandle.TKDataHandleInstance.CurrentVisitParts.Count != 0)
{
OnCreateVisitTitle(ObjName, pathButtonPool);
//Debug.LogError("hah"+Btn_CurrentVisitTitleList.Count);
//OnInitVisitTitleEffect();
}
}
}
public override void OnInit()
{
base.OnInit();
SetObjectActive(VisitInformationPanel, true);
SetObjectActive(DeviceDataPanel, false);
OnBindEvent();
}
private void OnCreateVisitTitle(string ObjName, RectTransform pathButtonPool)
{
VisitTitleListBtnNum = TKDataHandle.TKDataHandleInstance.CurrentVisitParts.Count;
//pathButtonPool.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 60, PuAnGetBrowserPathData.PuAnGetBrowserPathDataInstance.BrowserDataResules.Count * 65);//动态设置面板的长度2019.1.3
pathButtonPool.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 60, VisitTitleListBtnNum * 65);//动态设置面板的长度2019.1.3
//for (int i = 0; i < PuAnGetBrowserPathData.PuAnGetBrowserPathDataInstance.BrowserDataResules.Count; i++)//2019.1.3
for (int i = 0; i < VisitTitleListBtnNum; i++)//2019.1.3
{
string txtName = TKDataHandle.TKDataHandleInstance.CurrentVisitParts[i].partName;
int currentVisitTitleIDSSS = i;
//生成按钮对象,给位置,给名字,给点击事件
CreateVisitPartsTitleObj = OnCreateButton(ObjName, pathButtonPool);
CreateVisitPartsTitleObj.transform.localPosition = new Vector3(-20, (pathButtonPool.transform.localPosition.y + 50) - 100f * (i + 1), 0);
btn_CreateVisitTitle = CreateVisitPartsTitleObj.transform.GetChild(0).GetComponent<Button>();
btn_CreateVisitTitle.transform.GetChild(1).GetComponent<Text>().text = txtName;
//Debug.LogError("i***" + currentVisitTitleIDSSS);
btn_CreateVisitTitle.onClick.AddListener(delegate () { this.OnClonButtonClick(currentVisitTitleIDSSS); });
Btn_CurrentVisitTitleList.Add(btn_CreateVisitTitle);
OnCreateVisitContent(i, "DeviceVisitContent", "JsonProblemOptionPanel", "JsonProblemTextPanel");
OnInitVisitContentState();
}
OnInitVisitTitleEffect();
}
private void OnInitVisitTitleEffect()
{
//Debug.LogError("Init");
OnSetClonButtonEffect(0);
}
private void OnInitVisitContentState()
{
OnSetVisitContentState(0);
}
private void OnClonButtonClick(int currentVisitContentItemID)
{
OnSetClonButtonEffect(currentVisitContentItemID);
//Debug.Log("Click" + currentVisitContentItemID);
OnSetVisitContentState(currentVisitContentItemID);
}
private void OnSetClonButtonEffect(int currentVisitContentItemID)
{
if (Btn_CurrentVisitTitleList.Count != 0 && currentVisitContentItemID >= 0 && currentVisitContentItemID < Btn_CurrentVisitTitleList.Count)
{
foreach (var item in Btn_CurrentVisitTitleList)
{
btn_CreateVisitTitleImage = item.GetComponent<Image>();
item.transform.GetChild(1).GetComponent<Text>().color = Color.black;
btn_CreateVisitTitleImage.color = Color.white;
btn_CreateVisitTitleImage.transform.GetChild(0).GetComponent<Image>().color = Color.black;
btn_CreateVisitTitleImage.transform.GetChild(0).transform.GetChild(0).GetComponent<Image>().color = Color.black;
//Debug.LogError("hhahah$2");
}
btn_CreateVisitTitleImage = Btn_CurrentVisitTitleList[currentVisitContentItemID].GetComponent<Image>();
Btn_CurrentVisitTitleList[currentVisitContentItemID].transform.GetChild(1).GetComponent<Text>().color = Color.white;
btn_CreateVisitTitleImage.GetComponent<Image>().color = new Color(0 / 255f, 78 / 255f, 162 / 255f);
btn_CreateVisitTitleImage.transform.GetChild(0).GetComponent<Image>().color = Color.white;
btn_CreateVisitTitleImage.transform.GetChild(0).transform.GetChild(0).GetComponent<Image>().color = Color.white;
//Debug.LogError("1$$"+currentVisitContentItemID);
}
//Debug.LogError("2");
}
private void OnSetVisitContentState(int currentVisitContentItemID)
{
if (CurrentVisitContentItemList.Count != 0)
{
if (currentVisitContentItemID >= 0 && currentVisitContentItemID < CurrentVisitContentItemList.Count)
{
foreach (var item in CurrentVisitContentItemList)
{
item.SetActive(false);
}
CurrentVisitContentItemList[currentVisitContentItemID].SetActive(true);
}
}
}
public void OnCreateVisitContent(int currentPartID, string ParentName, string OptionTypeObjName, string inputTypeObjName)
{
CurrentVisitContentNum = TKDataHandle.TKDataHandleInstance.CurrentVisitParts[currentPartID].items.Length;
//pathButtonPool.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 60, PuAnGetBrowserPathData.PuAnGetBrowserPathDataInstance.BrowserDataResules.Count * 65);//动态设置面板的长度2019.1.3
CurrentVisitContentItem = OnCreateButton(ParentName, VisitContentParent).GetComponent<RectTransform>();
CurrentVisitContentItem.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 60, CurrentVisitContentNum * 65);
for (int i = 0; i < CurrentVisitContentNum; i++)
{
if (TKDataHandle.TKDataHandleInstance.CurrentVisitParts[currentPartID].items[i].valueType == "判断类型")
{
//生成按钮对象,给位置,给名字,给点击事件
CurrentVisitContentObj = OnCreateButton(OptionTypeObjName, CurrentVisitContentItem);
CurrentVisitContentObj.transform.localPosition = new Vector3(-20, (CurrentVisitContentItem.transform.localPosition.y + 170) - 90f * (i + 1), 0);
VisitProblemText = CurrentVisitContentObj.transform.GetChild(1).GetComponent<Button>();
VisitProblemText.transform.GetChild(0).GetComponent<Text>().text = TKDataHandle.TKDataHandleInstance.CurrentVisitParts[currentPartID].items[i].itemName;
//Toggle YesToggle;
//Toggle NoToggle;
//Toggle UnKnowToggle;
//Toggle NotApplicableToggle;
YesToggle = CurrentVisitContentObj.transform.GetChild(2).GetComponent<Toggle>();
NoToggle = CurrentVisitContentObj.transform.GetChild(3).GetComponent<Toggle>();
UnKnowToggle = CurrentVisitContentObj.transform.GetChild(4).GetComponent<Toggle>();
NotApplicableToggle = CurrentVisitContentObj.transform.GetChild(5).GetComponent<Toggle>();
var partID = TKDataHandle.TKDataHandleInstance.CurrentVisitParts[currentPartID].items[i].partId;
var itemId = TKDataHandle.TKDataHandleInstance.CurrentVisitParts[currentPartID].items[i].id;
YesToggle.onValueChanged.AddListener((bool value) => OnYesToggleClick(YesToggle, value, partID, itemId, YesToggle.transform.GetChild(0).GetComponent<Text>().text));
NoToggle.onValueChanged.AddListener((bool value) => OnNoToggleClick(NoToggle, value, partID, itemId, NoToggle.transform.GetChild(0).GetComponent<Text>().text));
UnKnowToggle.onValueChanged.AddListener((bool value) => OnUnKnowToggleClick(UnKnowToggle, value, partID, itemId, UnKnowToggle.transform.GetChild(0).GetComponent<Text>().text));
NotApplicableToggle.onValueChanged.AddListener((bool value) => OnNotApplicableToggleClick(NotApplicableToggle, value, partID, itemId, NotApplicableToggle.transform.GetChild(0).GetComponent<Text>().text));
}
else if (TKDataHandle.TKDataHandleInstance.CurrentVisitParts[currentPartID].items[i].valueType == "文本类型")
{
//生成按钮对象,给位置,给名字,给点击事件
CurrentVisitContentObj = OnCreateButton(inputTypeObjName, CurrentVisitContentItem);
var partID = TKDataHandle.TKDataHandleInstance.CurrentVisitParts[currentPartID].items[i].partId;
var itemId = TKDataHandle.TKDataHandleInstance.CurrentVisitParts[currentPartID].items[i].id;
CurrentVisitContentObj.transform.localPosition = new Vector3(-20, (CurrentVisitContentItem.transform.localPosition.y + 170) - 90f * (i + 1), 0);
VisitProblemText = CurrentVisitContentObj.transform.GetChild(1).GetComponent<Button>();
VisitProblemText.transform.GetChild(0).GetComponent<Text>().text = TKDataHandle.TKDataHandleInstance.CurrentVisitParts[currentPartID].items[i].itemName;
var ProblemWriteInputField = CurrentVisitContentObj.transform.GetChild(2).transform.GetChild(0).GetComponent<InputField>();
ProblemWriteInputField.onEndEdit.AddListener(delegate { CheckResultTextRecord(true, partID, itemId, ProblemWriteInputField);});
//CheckResultRecord(true, partID, itemId, ProblemWriteInputField.text);
}
if (i % 2 == 0)
{
CurrentVisitContentObj.GetComponent<Image>().color = Color.white;
}
else
{
CurrentVisitContentObj.GetComponent<Image>().color = new Color((230 / 255f), (237 / 255f), (245 / 255f), (255 / 255f));
}
}
CurrentVisitContentItemList.Add(CurrentVisitContentItem.gameObject);
}
private void OnYesToggleClick(Toggle toggle,bool value,int partID,int itemId,string currentSate)
{
//Debug.Log("Yes toggle change" + (value ? "on " + partID + " " + itemId + " " + currentSate : "of"));
CheckResultRecord(value, partID, itemId, currentSate);
}
private void OnNoToggleClick(Toggle toggle,bool value,int partID,int itemId,string currentSate)
{
//Debug.Log(" No toggle change"+(value?"on "+partID+" "+itemId+" "+currentSate:"of"));
CheckResultRecord(value, partID, itemId, currentSate);
}
private void OnUnKnowToggleClick(Toggle toggle,bool value,int partID,int itemId,string currentSate)
{
//Debug.Log("UnKnow toggle change"+(value?"on "+partID+" "+itemId+" "+currentSate:"of"));
CheckResultRecord(value, partID, itemId, currentSate);
}
private void OnNotApplicableToggleClick(Toggle toggle,bool value,int partID,int itemId,string currentSate)
{
//Debug.Log("NotApplicable toggle change"+(value?"on "+partID+" "+itemId+" "+currentSate:"of"));
CheckResultRecord(value, partID, itemId, currentSate);
}
//检查结果Toggle记录(每个item)
private static void CheckResultRecord(bool value, int partID, int itemId, string currentSate)
{
if (value)
{
var CheckStep = new CheckStep();
CheckStep.itemID = itemId;
CheckStep.partID = partID;
CheckStep.itemValue = currentSate;
//TKGameSaveDataStatus.singleton.checkSteps.Add(CheckStep);
if (TKGameSaveDataStatus.singleton.CheckStepDicyionary.ContainsKey(itemId))
{
TKGameSaveDataStatus.singleton.CheckStepDicyionary.Remove(itemId);
TKGameSaveDataStatus.singleton.CheckStepDicyionary.Add(itemId, CheckStep);
}
else
{
TKGameSaveDataStatus.singleton.CheckStepDicyionary.Add(itemId, CheckStep);
}
}
}
//检查结果inputFile记录(每个item)
private static void CheckResultTextRecord(bool value, int partID, int itemId, InputField currentInputFiled)
{
if (value)
{
var CheckStep = new CheckStep();
CheckStep.itemID = itemId;
CheckStep.partID = partID;
CheckStep.itemValue = currentInputFiled.text;
Debug.Log(itemId+"currentSate "+currentInputFiled.text);
//TKGameSaveDataStatus.singleton.checkSteps.Add(CheckStep);
if (TKGameSaveDataStatus.singleton.CheckStepDicyionary.ContainsKey(itemId))
{
TKGameSaveDataStatus.singleton.CheckStepDicyionary.Remove(itemId);
TKGameSaveDataStatus.singleton.CheckStepDicyionary.Add(itemId, CheckStep);
}
else
{
TKGameSaveDataStatus.singleton.CheckStepDicyionary.Add(itemId, CheckStep);
}
}
}
//显示设备基本信息数据
private void SetDeviceInformation(int currentEquiInfoID)
{
if (TKDataHandle.TKDataHandleInstance.CurrentEquiInfos.Length > 0)
{
if (currentEquiInfoID >= 0 && currentEquiInfoID < TKDataHandle.TKDataHandleInstance.CurrentEquiInfos.Length)
{
DeviceEquipNameText.text = TKDataHandle.TKDataHandleInstance.CurrentEquiInfos[currentEquiInfoID].equiName;
DeviceGradeText.text = TKDataHandle.TKDataHandleInstance.CurrentEquiInfos[currentEquiInfoID].equiLevel;
DeviceDescribeText.text = TKDataHandle.TKDataHandleInstance.CurrentEquiInfos[currentEquiInfoID].equiDescribe;
DeviceLayoutText.text = TKDataHandle.TKDataHandleInstance.CurrentEquiInfos[currentEquiInfoID].equiLayout;
//Debug.Log(TKDataHandle.TKDataHandleInstance.CurrentEquiInfos[currentEquiInfoID].equiLayout);
}
}
}
//Update is called once per frame
void Update()
{
SetDeviceInformation(0);
}
public override void OnBindEvent()
{
base.OnBindEvent();
EventTriggerListener.Get(CheckButton.gameObject).onClick = OnCheckButtonClick;
EventTriggerListener.Get(VisitInformationButton.gameObject).onClick = OnVisitInformationButtonClick;
EventTriggerListener.Get(CaptureButton.gameObject).onClick = OnCaptureButtonClick;
EventTriggerListener.Get(SoundRecordingButton.gameObject).onClick = OnSoundRecordingButtonClick;
EventTriggerListener.Get(MapFileButton.gameObject).onClick = OnMapFileButtonClick;
}
private void OnSetPanelActive()
{
}
private void OnCheckButtonClick(GameObject go)
{
if (go == CheckButton.gameObject)
{
OnCheckButton();
}
}
private void OnCheckButton()
{
Debug.Log("Check......");
TKCreateJson.TKCreateJsonInstance.OnCreateTKVisitData();
}
private void OnVisitInformationButtonClick(GameObject go)
{
if (go == VisitInformationButton.gameObject)
{
OnVisitInformationButton();
}
}
private void OnVisitInformationButton()
{
Debug.Log("VisitInformationButton......");
SetObjectActive(VisitInformationPanel,true);
SetObjectActive(DeviceDataPanel,false);
}
private void OnCaptureButtonClick(GameObject go)
{
if (go == CaptureButton.gameObject)
{
OnCaptureButton();
}
}
private void OnCaptureButton()
{
Debug.Log("CaptureButton......");
}
private void OnSoundRecordingButtonClick(GameObject go)
{
if (go == SoundRecordingButton.gameObject)
{
OnSoundRecordingButton();
}
}
private void OnSoundRecordingButton()
{
Debug.Log("SoundRecordingButton......");
}
private void OnMapFileButtonClick(GameObject go)
{
if (go == MapFileButton.gameObject)
{
OnMapFileButton();
}
}
private void OnMapFileButton()
{
Debug.Log("MapFileButton......");
SetObjectActive(VisitInformationPanel,false);
SetObjectActive(DeviceDataPanel,true);
}
}
UI界面搭建


浙公网安备 33010602011771号