- 一般情況下Json數據格式都是如下的字符串:
{ "programmers": [
{ "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },
{ "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }
],
"authors": [
{ "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [
{ "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
]
}
- 而在使用WebSocket進行通訊的過程中,后端方面我想自己組裝一個Json數據給我前端使用,前端是Unity 3D客戶端,解析Json數據的插件使用的是UnityLitJson,用這個插件所踩下的坑不計其數,最后我還是自己基於C#重新基寫了一套類似的用於Unity 3D的Json字符串解析庫,至少我自己用起來比較方便,不會出現莫名其妙的問題。先不說自己的庫,這里就講講UnityLitJson這個庫對於數據格式的苛刻要求,它必須接收如下這種格式,才能夠解析出來:
{"ChatType":"LongChat","UserState":"Online","CallingState":"Leisure","Msg":"Other"}
- 后端因為使用的基於Typescript的Node.js寫的,在組裝字符串以形成字符串的時候需要在拼接的字符串上也要加上雙引號,詳情如下(注意ES6字符串符號語法內部的那些雙引號):
function DataStruct(chatType: ChatType, userState: UserState, callingState: CallingState, msg: Msg) {
const result: string = `{
"ChatType": "`+ ChatType[chatType] + `",
"UserState": "`+ UserState[userState] + `",
"CallingState": "`+ CallingState[callingState] + `",
"Msg": "`+ Msg[msg] + `"
}`
return result;
}
- 這樣一來,Unity 3D使用LitJson就能解析字符串的格式,用下面的方式將字符串變為objct就成為可能,可見,Unity LitJson插件在本質上是在尋找字符串的引號,來將Json字符串變為對象,但是它最坑人的一個點是,在字符串格式不符合它解析的時候不會報錯,該作用域的代碼也不會執行,對程序員並不友好:
JsonData jsonResult = JsonMapper.ToObject(Encoding.UTF8.GetString(data));
作者:艾孜爾江
轉載請務必標明出處!