1
+ /*
2
+ * Programmer: Hunter Goodin
3
+ * Date Created: 09/19/2022 @ 10:00 PM
4
+ * Description: This class is for JSON objects that will persist on disk to the persistentDataPath even if the app is deleted.
5
+ */
6
+
7
+ using System ;
8
+ using System . Collections . Generic ;
9
+ using System . IO ;
10
+ using UnityEngine ;
11
+
12
+ namespace JSON
13
+ {
14
+ public class PersistentJSON : JSON
15
+ {
16
+ public PersistentJSON ( ) : base ( ) { }
17
+
18
+ public PersistentJSON ( TextAsset jsonFile ) : base ( jsonFile ) { }
19
+
20
+ /// <summary> Test </summary>
21
+ public override void WriteToFile ( )
22
+ {
23
+ if ( this . jsonFile == null )
24
+ {
25
+ Debug . LogError ( "ERROR: JSON TextAsset file never set!" ) ;
26
+ return ;
27
+ }
28
+
29
+ File . WriteAllText ( Path . Combine ( Application . persistentDataPath , $ "{ jsonFile . name } .json") , ToString ( ) ) ;
30
+ Debug . Log ( Path . Combine ( Application . persistentDataPath , $ "{ jsonFile . name } .json") ) ;
31
+ }
32
+
33
+ /// <summary> If the TextAsset was given, them also write to the TextAsset </summary>
34
+ public override void WriteToFile ( TextAsset jsonFile )
35
+ {
36
+ if ( this . jsonFile != null && this . jsonFile != jsonFile )
37
+ {
38
+ Debug . LogError ( $ "ERROR: Object already has a JSON TextAsset file: '{ this . jsonFile . name } .json'") ;
39
+ return ;
40
+ }
41
+
42
+ base . WriteToFile ( this . jsonFile ) ;
43
+
44
+ File . WriteAllText ( Path . Combine ( Application . persistentDataPath , $ "{ jsonFile . name } .json") , ToString ( ) ) ;
45
+ Debug . Log ( Path . Combine ( Application . persistentDataPath , $ "{ jsonFile . name } .json") ) ;
46
+ }
47
+
48
+ protected override void ParseJSON ( TextAsset jsonFile )
49
+ {
50
+ // If there is a persistent data path, read from that instead
51
+ if ( File . Exists ( Path . Combine ( Application . persistentDataPath , $ "{ jsonFile . name } .json") ) )
52
+ {
53
+ File . ReadAllText ( Path . Combine ( Application . persistentDataPath , $ "{ jsonFile . name } .json") ) ;
54
+
55
+ boolList = new List < JSONBoolean > ( ) ;
56
+ intList = new List < JSONInteger > ( ) ;
57
+ floatList = new List < JSONFloat > ( ) ;
58
+ stringList = new List < JSONString > ( ) ;
59
+ this . jsonFile = jsonFile ;
60
+
61
+ string [ ] lines = File . ReadAllText ( Path . Combine ( Application . persistentDataPath , $ "{ jsonFile . name } .json") ) . Split ( new string [ ] { "\r \n " , "\n " } , StringSplitOptions . None ) ;
62
+ lines [ lines . Length - 2 ] = ( lines [ lines . Length - 2 ] . EndsWith ( "," ) ) ? lines [ lines . Length - 2 ] : lines [ lines . Length - 2 ] + "," ;
63
+
64
+ for ( int i = 1 ; i < lines . Length - 1 ; i ++ )
65
+ {
66
+ string [ ] lineSplit = lines [ i ] . Split ( new string [ ] { ":" } , StringSplitOptions . None ) ;
67
+ lineSplit [ 0 ] = lineSplit [ 0 ] . Replace ( " \" " , "" ) ;
68
+ lineSplit [ 0 ] = lineSplit [ 0 ] . Replace ( "\t " , "" ) ;
69
+ lineSplit [ 0 ] = lineSplit [ 0 ] . Replace ( "\" " , "" ) ;
70
+ lineSplit [ 1 ] = lineSplit [ 1 ] . Substring ( 1 , lineSplit [ 1 ] . Length - 2 ) ;
71
+
72
+ // If it's a boolean
73
+ if ( lineSplit [ 1 ] == "true" || lineSplit [ 1 ] == "false" )
74
+ {
75
+ AddBool ( lineSplit [ 0 ] , Convert . ToBoolean ( lineSplit [ 1 ] ) ) ;
76
+ }
77
+
78
+ // If it's an int
79
+ if ( int . TryParse ( lineSplit [ 1 ] , out int num ) )
80
+ {
81
+ AddInt ( lineSplit [ 0 ] , num ) ;
82
+ }
83
+
84
+ // If it's a float
85
+ if ( lineSplit [ 1 ] . Contains ( "." ) && float . TryParse ( lineSplit [ 1 ] , out float fl ) )
86
+ {
87
+ AddFloat ( lineSplit [ 0 ] , fl ) ;
88
+ }
89
+
90
+ // If it's a string
91
+ if ( lineSplit [ 1 ] . StartsWith ( "\" " ) )
92
+ {
93
+ lineSplit [ 1 ] = lineSplit [ 1 ] . Replace ( "\" " , "" ) ;
94
+ AddString ( lineSplit [ 0 ] , lineSplit [ 1 ] ) ;
95
+ }
96
+ }
97
+ }
98
+ else
99
+ {
100
+ base . ParseJSON ( jsonFile ) ;
101
+ }
102
+ }
103
+ }
104
+ }
0 commit comments