==Author==
[mailto:schoen@defectivestudios.com Matt Schoen] of [http://www.defectivestudios.com Defective Studios]
==Download==
[[Media:JSONObject.zip|Download JSONObject.zip]]
= Intro =
I came across the need to send structured data to and from a server on one of my projects, and figured it would be worth my while to use JSON. When I looked into the issue, I tried a few of the C# implementations listed on [http://json.org json.org], but found them to be too complicated to work with and expand upon. So, I've written a very simple JSONObject class, which can be generically used to encode/decode data into a simple container. This page assumes that you know what JSON is, and how it works. It's rather simple, just go to json.org for a visual description of the encoding format.
As an aside, this class is pretty central to the [[AssetCloud]] content management system, from Defective Studios.
Update: The code has been updated to version 1.4 to incorporate user-submitted patches and bug reports. This fixes issues dealing with whitespace in the format, as well as empty arrays and objects, and escaped quotes within strings.
= Usage =
Users should not have to modify the JSONObject class themselves, and must follow the very simple proceedures outlined below:
Sample data (in JSON format):
<nowiki>
{
"TestObject": {
"SomeText": "Blah",
"SomeObject": {
"SomeNumber": 42,
"SomeBool": true,
"SomeNull": null
},
"SomeEmptyObject": { },
"SomeEmptyArray": [ ],
"EmbeddedObject": "{\"field\":\"Value with \\\"escaped quotes\\\"\"}"
}
}</nowiki>
= Features =
*Decode JSON-formatted strings into a usable data structure
*Encode structured data into a JSON-formatted string
*Interoperable with Dictionary and WWWForm
*Optimized parse/stringify functions -- minimal (unavoidable) garbage creation
*Asynchronous stringify function for serializing lots of data without frame drops
*MaxDepth parsing will skip over nested data that you don't need
*Special (non-compliant) "Baked" object type can store stringified data within parsed objects
*Copy to new JSONObject
*Merge with another JSONObject (experimental)
*Random access (with [int] or [string])
*ToString() returns JSON data with optional "pretty" flag to include newlines and tabs
*Switch between double and float for numeric storage depending on level of precision needed (and to ensure that numbers are parsed/stringified correctly)
*Supports Infinity and NaN values
*JSONTemplates static class provides serialization functions for common classes like Vector3, Matrix4x4
*Object pool implementation (experimental)
*Handy JSONChecker window to test parsing on sample data
It should be pretty obvious what this parser can and cannot do. If anyone reading this is a JSON buff (is there such a thing?) please feel free to expand and modify the parser to be more compliant. Currently I am using the .NET System.Convert namespace functions for parsing the data itself. It parses strings and numbers, which was all that I needed of it, but unless the formatting is supported by System.Convert, it may not incorporate all proper JSON strings. Also, having never written a JSON parser before, I don't doubt that I could improve the efficiency or correctness of the parser. It serves my purpose, and hopefully will help you with your project! Let me know if you make any improvements :)
Also, you JSON buffs (really, who would admit to being a JSON buff...) might also notice from my feature list that this thing isn't exactly to specifications. Here is where it differs:
*"a string" is considered valid JSON. There is an optional "strict" parameter to the parser which will bomb out on such input, in case that matters to you.
*The "Baked" mode is totally made up.
*The "MaxDepth" parsing is totally made up.
*NaN and Infinity aren't officially supported by JSON ([http://stackoverflow.com/questions/1423081/json-left-out-infinity-and-nan-json-status-in-ecmascript read more] about this issue... I lol'd @ the first comment on the first answer)
*I have no idea about edge cases in my parsing strategy. I have been using this code for about 3 years now and have only had to modify the parser because other people's use cases (still valid JSON) didn't parse correctly. In my experience, anything that this code generates is parsed just fine.
== Encoding ==
Encoding is something of a hard-coded process. This is because I have no idea what your data is! It would be great if this were some sort of interface for taking an entire class and encoding it's number/string fields, but it's not. I've come up with a few clever ways of using loops and/or recursive methods to cut down of the amount of code I have to write when I use this tool, but they're pretty project-specific.
Note: This section used to be WRONG! And now it's OLD! Will update later... this will all still work, but there are now a couple of ways to skin this cat.
<syntaxhighlight lang="csharp">
//Note: your data can only be numbers and strings. This is not a solution for object serialization or anything like that.
JSONObject j = new JSONObject(JSONObject.Type.OBJECT);
//number
j.AddField("field1", 0.5);
//string
j.AddField("field2", "sampletext");
//array
JSONObject arr = new JSONObject(JSONObject.Type.ARRAY);
j.AddField("field3", arr);
arr.Add(1);
arr.Add(2);
arr.Add(3);
string encodedString = j.print();
</syntaxhighlight>
NEW! The constructor, Add, and AddField functions now support a nested delegate structure. This is useful if you need to create a nested JSONObject in a single line. For example:
<syntaxhighlight lang="csharp">
DoRequest(URL, new JSONObject(delegate(JSONObject request) {
request.AddField("sort", delegate(JSONObject sort) {
sort.AddField("_timestamp", "desc");
});
request.AddField("query", new JSONObject(delegate(JSONObject query) {
query.AddField("match_all", JSONObject.obj);
}));
request.AddField("fields", delegate(JSONObject fields) {
fields.Add("_timestamp");
});
}).ToString());
</syntaxhighlight>
== Decoding ==
Decoding is much simpler on the input end, and again, what you do with the JSONObject will vary on a per-project basis. One of the more complicated way to extract the data is with a recursive function, as drafted below. Calling the constructor with a properly formatted JSON string will return the root object (or array) containing all of its children, in one neat reference! The data is in a public ArrayList called list, with a matching key list (called keys!) if the root is an Object. If that's confusing, take a glance over the following code and the print() method in the JSONOBject class. If there is an error in the JSON formatting (or if there's an error with my code!) the debug console will read "improper JSON formatting".
<syntaxhighlight lang="csharp">
string encodedString = "{\"field1\": 0.5,\"field2\": \"sampletext\",\"field3\": [1,2,3]}";
JSONObject j = new JSONObject(encodedString);
accessData(j);
//access data (and print it)
void accessData(JSONObject obj){
switch(obj.type){
case JSONObject.Type.OBJECT:
for(int i = 0; i < obj.list.Count; i++){
string key = (string)obj.keys[i];
JSONObject j = (JSONObject)obj.list[i];
Debug.Log(key);
accessData(j);
}
break;
case JSONObject.Type.ARRAY:
foreach(JSONObject j in obj.list){
accessData(j);
}
break;
case JSONObject.Type.STRING:
Debug.Log(obj.str);
break;
case JSONObject.Type.NUMBER:
Debug.Log(obj.n);
break;
case JSONObject.Type.BOOL:
Debug.Log(obj.b);
break;
case JSONObject.Type.NULL:
Debug.Log("NULL");
break;
}
}
</syntaxhighlight>
NEW! Decoding now also supports a delegate format which will automatically check if a field exists before processing the data, providing an optional parameter for an OnFieldNotFound response. For example:
<syntaxhighlight lang="csharp">
new JSONObject(data);
list.GetField("hits", delegate(JSONObject hits) {
hits.GetField("hits", delegate(JSONObject hits2) {
没有合适的资源?快使用搜索试试~ 我知道了~
unity WebSocket
共185个文件
meta:98个
cs:81个
txt:2个
2星 需积分: 50 72 下载量 48 浏览量
2018-07-13
18:59:17
上传
评论 1
收藏 239KB ZIP 举报
温馨提示
WebSocket Unity 和后端交互 实现类似 Socket 的双向交互 欢迎拿去琢磨 修改Url 就可用
资源推荐
资源详情
资源评论
收起资源包目录
unity WebSocket (185个子文件)
WebSocket.cs 63KB
Ext.cs 58KB
WebHeaderCollection.cs 49KB
HttpUtility.cs 35KB
HttpListenerResponse.cs 28KB
JSONObject.cs 27KB
Cookie.cs 22KB
HttpListener.cs 22KB
HttpListenerRequest.cs 21KB
CookieCollection.cs 19KB
WebSocketFrame.cs 18KB
HttpConnection.cs 13KB
EndPointListener.cs 13KB
HttpStatusCode.cs 13KB
TcpListenerWebSocketContext.cs 11KB
SocketIOComponent.cs 11KB
Logger.cs 10KB
HttpListenerPrefixCollection.cs 10KB
HttpListenerWebSocketContext.cs 9KB
ChunkStream.cs 9KB
AuthenticationResponse.cs 9KB
ResponseStream.cs 8KB
VectorTemplates.cs 8KB
WebSocketStream.cs 7KB
WebSocketContext.cs 7KB
RequestStream.cs 7KB
HttpListenerContext.cs 6KB
ChunkedRequestStream.cs 6KB
ListenerPrefix.cs 5KB
EndPointManager.cs 5KB
NetworkCredential.cs 5KB
ListenerAsyncResult.cs 5KB
HttpDigestIdentity.cs 5KB
HandshakeRequest.cs 5KB
CookieException.cs 5KB
HandshakeResponse.cs 5KB
CloseStatusCode.cs 5KB
PayloadData.cs 4KB
LogData.cs 4KB
AuthenticationChallenge.cs 4KB
TestSocketIO.cs 4KB
HttpListenerException.cs 4KB
AuthenticationBase.cs 4KB
MessageEventArgs.cs 4KB
Decoder.cs 3KB
CloseEventArgs.cs 3KB
HttpStreamAsyncResult.cs 3KB
HandshakeBase.cs 3KB
HttpHeaderInfo.cs 3KB
JSONTemplates.cs 3KB
Encoder.cs 3KB
WebSocketException.cs 3KB
SslStream.cs 2KB
HttpBasicIdentity.cs 2KB
Opcode.cs 2KB
WebSocketState.cs 2KB
Chunk.cs 2KB
Packet.cs 2KB
QueryStringCollection.cs 2KB
ErrorEventArgs.cs 2KB
ReadBufferState.cs 2KB
HttpVersion.cs 2KB
AuthenticationSchemes.cs 2KB
Parser.cs 2KB
LogLevel.cs 2KB
CompressionMethod.cs 2KB
Ack.cs 2KB
SocketIOEvent.cs 2KB
InputChunkState.cs 2KB
ByteOrder.cs 2KB
InputState.cs 2KB
LineState.cs 2KB
SocketIOException.cs 1KB
HttpHeaderType.cs 1KB
SocketPacketType.cs 1KB
EnginePacketType.cs 1KB
JSONChecker.cs 1KB
Mask.cs 1KB
Fin.cs 1KB
Rsv.cs 1KB
AssemblyInfo.cs 1KB
websocket-sharp.csproj 6KB
InputState.cs.meta 277B
Decoder.cs.meta 277B
EndPointListener.cs.meta 277B
HttpListenerResponse.cs.meta 277B
TcpListenerWebSocketContext.cs.meta 277B
HttpConnection.cs.meta 277B
WebSocketException.cs.meta 277B
LineState.cs.meta 277B
JSONObject.cs.meta 277B
AuthenticationBase.cs.meta 277B
PayloadData.cs.meta 277B
ReadBufferState.cs.meta 277B
HandshakeBase.cs.meta 277B
SocketPacketType.cs.meta 277B
HttpListenerException.cs.meta 277B
Logger.cs.meta 277B
CloseStatusCode.cs.meta 277B
ChunkStream.cs.meta 277B
共 185 条
- 1
- 2
资源评论
- unity搬运工2019-02-18Asset Store 上免费的东西,你放到这来骗积分,好意思???大家不要下了,去Unity3d 官方商店里免费下载qq2540858502019-04-12兄嘚 ,这个资源是不是很好用?什么叫骗 骗就是不能用上传不能供广大网友提供思考价值的资源
- qq3043392018-11-08评论就是不太好用,看不懂qq2540858502019-04-12有什么不明白的 可以说出来我看到后会在我理解的范围解答
qq254085850
- 粉丝: 18
- 资源: 52
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功