反序列化JSON(string / base64)时出错?

时间:2013-11-28 03:12:56

标签: c# string encoding utf-8 base64

我想加载一个保存为base64的字符串,但我总是收到此错误。我正在使用SimpleJson类(http://wiki.unity3d.com/index.php/SimpleJSON):

  

异常:反序列化JSON时出错。未知标签:66   SimpleJSON.JSONNode.Deserialize(System.IO.BinaryReader aReader)(在Assets / plugins / 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);
            }
            }
        }

由于

1 个答案:

答案 0 :(得分:1)

您遇到的问题是您尝试在此处保存为compressedbase64string:

string str = I.SaveToCompressedBase64();

当您尝试解析并解压缩时会给您带来麻烦。所以,我建议你使用他们的SaveToBase64()如下“

string str = I.SaveToBase64();

保持程序的其余部分不变(除非我没有看到另一个错误)。

另一种方法是使用他们的LoadFromCompressedBase64(),因此除了以下情况之外,您的代码看起来一样:

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