处理字符串麻烦的地方在于,转义字符需要特殊处理,都这转义字符就会直接显示而不能展示特殊的作用。好在StringBuilder功能非常强大,提供处理各种情况的接口。
解析Unicode字符
在JSON中,Unicode字符是以u开头跟随4个码点组成的转义字符。码点在StringBuilder的Append重载函数中是直接支持的。所以,我们只要把u后面的4个字符,转换成码点传递给Append就可以了。
/// <summary>
/// Get the unicode code point.
/// </summary>
private static char GetUnicodeCodePoint(char c1, char c2, char c3, char c4)
{
// 把u后面的4个char转换成码点,注意这里需要是char类型,才能被Append正确处理。
// 4个char转换为int后,映射到16进制的高位到低位,然后相加得到码点。
return (char)
(
UnicodeCharToInt(c1) * 0x1000 +
UnicodeCharToInt(c2) * 0x100 +
UnicodeCharToInt(c3) * 0x10 +
UnicodeCharToInt(c4)
);
}
/// <summary>
/// Single unicode char convert to int.
/// </summary>
private static int UnicodeCharToInt(char c)
{
// 使用switch case 减少 if else 的判断
switch (c)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
return c - '0';
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
return c - 'a' + 10;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
return c - 'A' + 10;
}
throw new Exception(string.Format("Json Unicode char '{0}' error", c));
}
解析number
private static JsonValue ParseNumber(ref Data data)
{
var start = data.index;
// 收集数值字符
while (true)
{
switch (data.json[++data.index])
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '-':
case '+':
case '.':
case 'e':
case 'E':
continue;
}
break;
}
// 抠出数值字符串
var strNum = data.json.Substring(start, data.index - start);
float num;
// 当成float处理,当然也可以用double
if (float.TryParse(strNum, out num))
{
return new JsonValue(JsonType.Number, num);
}
else
{
throw new Exception(string.Format("Json ParseNumber error, can not parse string [{0}]", strNum));
}
}
如何使用
只有一句话,把Json字符串解析成JsonValue对象,然后JsonValue对象包含了所有的数值。
var jsonValue = MojoUnity.Json.Parse(jsonString);
JsonValue的访问API
// JsonValue 当做 string
public string AsString();
// JsonValue 当做 float
public float AsFloat();
// JsonValue 当做 int
public float AsInt();
// JsonValue 当做 bool
public float AsBool();
// JsonValue 当做 null
public float IsNull();
// JsonValue 当做 Dictionary
public Dictionary<string, JsonValue> AsObject();
// JsonValue 当做 Dictionary 并根据 key 获取 value 当做JsonValue
public JsonValue AsObjectGet(string key);
// JsonValue 当做 Dictionary 并根据 key 获取 value 当做 Dictionary
public Dictionary<string, JsonValue> AsObjectGetObject(string key);
// JsonValue 当做 Dictionary 并根据 key 获取 value 当做 List
public List<JsonValue> AsObjectGetArray(string key);
// JsonValue 当做 Dictionary 并根据 key 获取 value 当做 string
public string AsObjectGetString(string key);
// JsonValue 当做 Dictionary 并根据 key 获取 value 当做 float
public float AsObjectGetFloat(string key);
// JsonValue 当做 Dictionary 并根据 key 获取 value 当做 int
public int AsObjectGetInt(string key);
// JsonValue 当做 Dictionary 并根据 key 获取 value 当做 bool
public bool AsObjectGetBool(string key);
// JsonValue 当做 Dictionary 并根据 key 获取 value 当做 null
public bool AsObjectGetIsNull(string key);
// JsonValue 当做 List
public List<JsonValue> AsArray();
// JsonValue 当做 List 并获取 index 的 value 当做 JsonValue
public JsonValue AsArrayGet(int index);
// JsonValue 当做 List 并获取 index 的 value 当做 Dictionary
public Dictionary<string, JsonValue> AsArrayGetObject(int index);
// JsonValue 当做 List 并获取 index 的 value 当做 List
public List<JsonValue> AsArrayGetArray(int index);
// JsonValue 当做 List 并获取 index 的 value 当做 string
public string AsArrayGetString(int index);
// JsonValue 当做 List 并获取 index 的 value 当做 float
public float AsArrayGetFloat(int index);
// JsonValue 当做 List 并获取 index 的 value 当做 int
public int AsArrayGetInt(int index);
// JsonValue 当做 List 并获取 index 的 value 当做 bool
public bool AsArrayGetBool(int index);
// JsonValue 当做 List 并获取 index 的 value 当做 null
public bool AsArrayGetIsNull(int index);










