2013-11-28 52 views
0

我想加載一個保存爲base64的字符串,但我總是得到這個錯誤。我正在使用SimpleJson類(http://wiki.unity3d.com/index.php/SimpleJSON):反序列化JSON(字符串/ base64)錯誤?

異常:反序列化JSON時出錯。未知標籤:66 SimpleJSON.JSONNode.Deserialize(System.IO.BinaryReader aReader)(在資產/插件/ SimpleJSON.cs:512)

我的代碼:

var I = new JSONClass(); 
I["author"]["name"] = "testName"; 
I["author2"]["name2"] = "testName2"; 
string str = I.SaveToCompressedBase64(); 
//output : QlpoOTFBWSZTWdFZTaIAAAdNgH/gEAAA etc. 

//#Error deserializing JSON 
string res = JSONClass.LoadFromBase64(str);//.ToString(); 

這裏是方法從類:

public static JSONNode LoadFromBase64(string aBase64) 
     { 
      var tmp = System.Convert.FromBase64String(aBase64); 
      var stream = new System.IO.MemoryStream(tmp); 
      stream.Position = 0; 
      return LoadFromStream(stream); 
     } 

public static JSONNode LoadFromStream(System.IO.Stream aData) 
     { 
      using(var R = new System.IO.BinaryReader(aData)) 
      { 
       return Deserialize(R); 
      } 
     } 


public static JSONNode Deserialize(System.IO.BinaryReader aReader) 
     { 
      JSONBinaryTag type = (JSONBinaryTag)aReader.ReadByte(); 
      switch(type) 
      { 
      case JSONBinaryTag.Array: 
      { 
       int count = aReader.ReadInt32(); 
       JSONArray tmp = new JSONArray(); 
       for(int i = 0; i < count; i++) 
        tmp.Add(Deserialize(aReader)); 
       return tmp; 
      } 
      case JSONBinaryTag.Class: 
      { 
       int count = aReader.ReadInt32();     
       JSONClass tmp = new JSONClass(); 
       for(int i = 0; i < count; i++) 
       { 
        string key = aReader.ReadString(); 
        var val = Deserialize(aReader); 
        tmp.Add(key, val); 
       } 
       return tmp; 
      } 
      case JSONBinaryTag.Value: 
      { 
       return new JSONData(aReader.ReadString()); 
      } 
      case JSONBinaryTag.IntValue: 
      { 
       return new JSONData(aReader.ReadInt32()); 
      } 
      case JSONBinaryTag.DoubleValue: 
      { 
       return new JSONData(aReader.ReadDouble()); 
      } 
      case JSONBinaryTag.BoolValue: 
      { 
       return new JSONData(aReader.ReadBoolean()); 
      } 
      case JSONBinaryTag.FloatValue: 
      { 
       return new JSONData(aReader.ReadSingle()); 
      } 

      default: 
      { 
       throw new Exception("Error deserializing JSON. Unknown tag: " + type); 
      } 
      } 
     } 

感謝

+0

您試圖解析字符串,壓縮解壓縮嘗試以base64嘗試解析它之前的字符串。 – rdodev

+0

@rdodev謝謝,你能告訴我該怎麼做嗎?我嘗試'var base64 = System.Convert.FromBase64String(str);'但似乎沒有辦法做到這一點。 – Paul

+0

我在下面的答案應該有所幫助。 – rdodev

回答

1

您遇到的問題是,您要保存到compressedbase64string這裏:

string str = I.SaveToCompressedBase64();

這是給你的麻煩,當您嘗試分析它並解壓縮。所以,我建議你使用他們的SaveToBase64()如下」

string str = I.SaveToBase64();

並留下您的計劃不變,其餘(除非有我沒有看到其他的錯誤)。

另一種方法是使用他們LoadFromCompressedBase64(),所以您的代碼將看起來是一樣的除外:

string res = JSONClass.LoadFromCompressedBase64(str);//.ToString();

+0

完美!我很接近:)我沒有注意在方法中的「壓縮」,非常好,謝謝! – Paul