Implement own Json
This commit is contained in:
parent
b5dadbceb9
commit
e78bde556b
|
@ -0,0 +1,161 @@
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Ooui
|
||||||
|
{
|
||||||
|
class JsonConvert
|
||||||
|
{
|
||||||
|
static void WriteJsonString (System.IO.TextWriter w, string s)
|
||||||
|
{
|
||||||
|
w.Write ('\"');
|
||||||
|
for (var i = 0; i < s.Length; i++) {
|
||||||
|
var c = s[i];
|
||||||
|
if (c == '\"') {
|
||||||
|
w.Write ("\\\"");
|
||||||
|
}
|
||||||
|
else if (c == '\r') {
|
||||||
|
w.Write ("\\r");
|
||||||
|
}
|
||||||
|
else if (c == '\n') {
|
||||||
|
w.Write ("\\n");
|
||||||
|
}
|
||||||
|
else if (c == '\t') {
|
||||||
|
w.Write ("\\t");
|
||||||
|
}
|
||||||
|
else if (c == '\b') {
|
||||||
|
w.Write ("\\b");
|
||||||
|
}
|
||||||
|
else if (c == '\\') {
|
||||||
|
w.Write ("\\");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
w.Write (c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
w.Write ('\"');
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void WriteJsonValue (System.IO.TextWriter w, object value)
|
||||||
|
{
|
||||||
|
if (value == null) {
|
||||||
|
w.Write ("null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var s = value as string;
|
||||||
|
if (s != null) {
|
||||||
|
WriteJsonString (w, s);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = value as Array;
|
||||||
|
if (a != null) {
|
||||||
|
w.Write ('[');
|
||||||
|
var head = "";
|
||||||
|
foreach (var o in a) {
|
||||||
|
w.Write (head);
|
||||||
|
WriteJsonValue (w, o);
|
||||||
|
head = ",";
|
||||||
|
}
|
||||||
|
w.Write (']');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var e = value as EventTarget;
|
||||||
|
if (e != null) {
|
||||||
|
w.Write ('\"');
|
||||||
|
w.Write (e.Id);
|
||||||
|
w.Write ('\"');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value is Color) {
|
||||||
|
WriteJsonString (w, ((Color)value).ToString ());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var icult = System.Globalization.CultureInfo.InvariantCulture;
|
||||||
|
|
||||||
|
if (value is double) {
|
||||||
|
w.Write (((double)value).ToString (icult));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value is int) {
|
||||||
|
w.Write (((int)value).ToString (icult));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value is float) {
|
||||||
|
w.Write (((float)value).ToString (icult));
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteJsonString (w, Convert.ToString (value, icult));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string SerializeObject (object value)
|
||||||
|
{
|
||||||
|
using (var sw = new System.IO.StringWriter ()) {
|
||||||
|
WriteJsonValue (sw, value);
|
||||||
|
return sw.ToString ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static object ReadJsonArray (string j, ref int i)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static object ReadJsonObject (string json, ref int i)
|
||||||
|
{
|
||||||
|
var e = json.Length;
|
||||||
|
while (i < e) {
|
||||||
|
while (i < e && char.IsWhiteSpace (json[i]))
|
||||||
|
i++;
|
||||||
|
if (i >= e)
|
||||||
|
throw new Exception ("JSON Unexpected end");
|
||||||
|
var n = e - i;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
throw new NotImplementedException ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static object ReadJsonString (string j, ref int i)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static object ReadJsonNumber (string j, ref int i)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException ();
|
||||||
|
}
|
||||||
|
|
||||||
|
static object ReadJsonValue (string json, ref int i)
|
||||||
|
{
|
||||||
|
var e = json.Length;
|
||||||
|
while (i < e && char.IsWhiteSpace (json[i]))
|
||||||
|
i++;
|
||||||
|
if (i >= e)
|
||||||
|
throw new Exception ("JSON Unexpected end");
|
||||||
|
var n = e - i;
|
||||||
|
switch (json[i]) {
|
||||||
|
case '[':
|
||||||
|
return ReadJsonArray (json, ref i);
|
||||||
|
case '{':
|
||||||
|
return ReadJsonObject (json, ref i);
|
||||||
|
case '\"':
|
||||||
|
return ReadJsonString (json, ref i);
|
||||||
|
case 'f':
|
||||||
|
i += 5;
|
||||||
|
return false;
|
||||||
|
case 't':
|
||||||
|
i += 4;
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return ReadJsonNumber (json, ref i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static object ReadJsonValue (string json, int startIndex)
|
||||||
|
{
|
||||||
|
var i = startIndex;
|
||||||
|
return ReadJsonValue (json, ref i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
152
Ooui/Message.cs
152
Ooui/Message.cs
|
@ -36,91 +36,6 @@ namespace Ooui
|
||||||
Value = value,
|
Value = value,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void WriteJsonString (System.IO.TextWriter w, string s)
|
|
||||||
{
|
|
||||||
w.Write ('\"');
|
|
||||||
for (var i = 0; i < s.Length; i++) {
|
|
||||||
var c = s[i];
|
|
||||||
if (c == '\"') {
|
|
||||||
w.Write ("\\\"");
|
|
||||||
}
|
|
||||||
else if (c == '\r') {
|
|
||||||
w.Write ("\\r");
|
|
||||||
}
|
|
||||||
else if (c == '\n') {
|
|
||||||
w.Write ("\\n");
|
|
||||||
}
|
|
||||||
else if (c == '\t') {
|
|
||||||
w.Write ("\\t");
|
|
||||||
}
|
|
||||||
else if (c == '\b') {
|
|
||||||
w.Write ("\\b");
|
|
||||||
}
|
|
||||||
else if (c == '\\') {
|
|
||||||
w.Write ("\\");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
w.Write (c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
w.Write ('\"');
|
|
||||||
}
|
|
||||||
|
|
||||||
static void WriteJsonValue (System.IO.TextWriter w, object value)
|
|
||||||
{
|
|
||||||
if (value == null) {
|
|
||||||
w.Write ("null");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var s = value as string;
|
|
||||||
if (s != null) {
|
|
||||||
WriteJsonString (w, s);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var a = value as Array;
|
|
||||||
if (a != null) {
|
|
||||||
w.Write ('[');
|
|
||||||
var head = "";
|
|
||||||
foreach (var o in a) {
|
|
||||||
w.Write (head);
|
|
||||||
WriteJsonValue (w, o);
|
|
||||||
head = ",";
|
|
||||||
}
|
|
||||||
w.Write (']');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var e = value as EventTarget;
|
|
||||||
if (e != null) {
|
|
||||||
w.Write ('\"');
|
|
||||||
w.Write (e.Id);
|
|
||||||
w.Write ('\"');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value is Color) {
|
|
||||||
WriteJsonString (w, ((Color)value).ToString ());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var icult = System.Globalization.CultureInfo.InvariantCulture;
|
|
||||||
|
|
||||||
if (value is double) {
|
|
||||||
w.Write (((double)value).ToString (icult));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value is int) {
|
|
||||||
w.Write (((int)value).ToString (icult));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (value is float) {
|
|
||||||
w.Write (((float)value).ToString (icult));
|
|
||||||
}
|
|
||||||
|
|
||||||
WriteJsonString (w, Convert.ToString (value, icult));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void WriteJson (System.IO.TextWriter w)
|
public void WriteJson (System.IO.TextWriter w)
|
||||||
{
|
{
|
||||||
w.Write ('{');
|
w.Write ('{');
|
||||||
|
@ -139,7 +54,7 @@ namespace Ooui
|
||||||
w.Write (Key);
|
w.Write (Key);
|
||||||
if (Value != null) {
|
if (Value != null) {
|
||||||
w.Write ("\",\"v\":");
|
w.Write ("\",\"v\":");
|
||||||
WriteJsonValue (w, Value);
|
JsonConvert.WriteJsonValue (w, Value);
|
||||||
w.Write ('}');
|
w.Write ('}');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -154,6 +69,71 @@ namespace Ooui
|
||||||
return sw.ToString ();
|
return sw.ToString ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Message FromJson (string json)
|
||||||
|
{
|
||||||
|
var m = new Message ();
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
var e = json.Length;
|
||||||
|
|
||||||
|
while (i < e) {
|
||||||
|
while (i < e && (json[i]==',' || json[i]=='{' || char.IsWhiteSpace (json[i])))
|
||||||
|
i++;
|
||||||
|
if (i >= e)
|
||||||
|
throw new Exception ("JSON Unexpected end");
|
||||||
|
var n = e - i;
|
||||||
|
if (json[i] == '}')
|
||||||
|
break;
|
||||||
|
if (n > 4 && json[i] == '\"' && json[i+2] == '\"' && json[i+3] == ':') {
|
||||||
|
switch (json[i + 1]) {
|
||||||
|
case 'm':
|
||||||
|
if (json[i + 4] == '\"' && json[i + 5] == 'e') {
|
||||||
|
m.MessageType = MessageType.Event;
|
||||||
|
}
|
||||||
|
i += 5;
|
||||||
|
while (i < e && json[i] != '\"') i++;
|
||||||
|
i++;
|
||||||
|
break;
|
||||||
|
case 'k': {
|
||||||
|
i += 5;
|
||||||
|
var se = i;
|
||||||
|
while (se < e && json[se] != '\"')
|
||||||
|
se++;
|
||||||
|
m.Key = json.Substring (i, se - i);
|
||||||
|
i = se + 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
m.Value = JsonConvert.ReadJsonValue (json, i + 4);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (n > 5 && json[i] == '\"' && json[i + 3] == '\"' && json[i + 4] == ':' && json[i+5] == '\"') {
|
||||||
|
switch (json[i + 1]) {
|
||||||
|
case 'i': {
|
||||||
|
i += 6;
|
||||||
|
var se = i;
|
||||||
|
while (se < e && json[se] != '\"')
|
||||||
|
se++;
|
||||||
|
m.TargetId = json.Substring (i, se - i);
|
||||||
|
i = se + 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new Exception ("JSON Expected property");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString ()
|
||||||
|
{
|
||||||
|
return ToJson ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[JsonConverter (typeof (StringEnumConverter))]
|
[JsonConverter (typeof (StringEnumConverter))]
|
||||||
|
|
|
@ -464,8 +464,9 @@ namespace Ooui
|
||||||
|
|
||||||
public static byte[] GetData (object obj)
|
public static byte[] GetData (object obj)
|
||||||
{
|
{
|
||||||
var r = Newtonsoft.Json.JsonConvert.SerializeObject (obj);
|
var r = Ooui.JsonConvert.SerializeObject (obj);
|
||||||
return System.Text.Encoding.UTF8.GetBytes (r);
|
var e = new UTF8Encoding (false);
|
||||||
|
return e.GetBytes (r);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Respond (HttpListenerContext listenerContext, CancellationToken token)
|
public override void Respond (HttpListenerContext listenerContext, CancellationToken token)
|
||||||
|
|
Loading…
Reference in New Issue