151 lines
4.4 KiB
C#
151 lines
4.4 KiB
C#
using System;
|
|
|
|
namespace Ooui
|
|
{
|
|
using static System.FormattableString;
|
|
|
|
public class JsonConvert
|
|
{
|
|
public 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)
|
|
{
|
|
switch(value) {
|
|
case string s:
|
|
WriteJsonString (w, s);
|
|
break;
|
|
case Array a:
|
|
w.Write ('[');
|
|
var head = "";
|
|
foreach (var o in a) {
|
|
w.Write (head);
|
|
WriteJsonValue (w, o);
|
|
head = ",";
|
|
}
|
|
w.Write (']');
|
|
break;
|
|
case EventTarget e:
|
|
w.Write ('\"');
|
|
w.Write (e.Id);
|
|
w.Write ('\"');
|
|
break;
|
|
case Color c:
|
|
WriteJsonString (w, c.ToString());
|
|
break;
|
|
case double d:
|
|
w.Write (Invariant ($"{d}"));
|
|
break;
|
|
case int i:
|
|
w.Write (Invariant ($"{i}"));
|
|
break;
|
|
case float f:
|
|
w.Write (Invariant ($"{f}"));
|
|
break;
|
|
case null:
|
|
w.Write ("null");
|
|
break;
|
|
default:
|
|
w.Write (Newtonsoft.Json.JsonConvert.SerializeObject (value));
|
|
break;
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|