2008-11-18 03:16:38 +00:00
|
|
|
|
using System;
|
2009-08-06 19:37:33 +00:00
|
|
|
|
using System.Collections;
|
2008-11-18 03:16:38 +00:00
|
|
|
|
using System.Collections.Generic;
|
2009-08-06 19:37:33 +00:00
|
|
|
|
using System.Collections.Specialized;
|
2008-12-01 23:58:45 +00:00
|
|
|
|
using System.IO;
|
2008-11-18 03:16:38 +00:00
|
|
|
|
using LitJson;
|
|
|
|
|
|
|
|
|
|
|
|
namespace OpenMetaverse.StructuredData
|
|
|
|
|
|
{
|
|
|
|
|
|
public static partial class OSDParser
|
|
|
|
|
|
{
|
2008-12-01 23:58:45 +00:00
|
|
|
|
public static OSD DeserializeJson(Stream json)
|
|
|
|
|
|
{
|
|
|
|
|
|
using (StreamReader streamReader = new StreamReader(json))
|
|
|
|
|
|
{
|
|
|
|
|
|
JsonReader reader = new JsonReader(streamReader);
|
|
|
|
|
|
return DeserializeJson(JsonMapper.ToObject(reader));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2008-11-18 03:16:38 +00:00
|
|
|
|
public static OSD DeserializeJson(string json)
|
|
|
|
|
|
{
|
|
|
|
|
|
return DeserializeJson(JsonMapper.ToObject(json));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static OSD DeserializeJson(JsonData json)
|
|
|
|
|
|
{
|
2010-03-13 11:17:48 +00:00
|
|
|
|
if (json == null) return new OSD();
|
|
|
|
|
|
|
2008-11-18 03:16:38 +00:00
|
|
|
|
switch (json.GetJsonType())
|
|
|
|
|
|
{
|
|
|
|
|
|
case JsonType.Boolean:
|
|
|
|
|
|
return OSD.FromBoolean((bool)json);
|
|
|
|
|
|
case JsonType.Int:
|
|
|
|
|
|
return OSD.FromInteger((int)json);
|
|
|
|
|
|
case JsonType.Long:
|
|
|
|
|
|
return OSD.FromLong((long)json);
|
|
|
|
|
|
case JsonType.Double:
|
|
|
|
|
|
return OSD.FromReal((double)json);
|
|
|
|
|
|
case JsonType.String:
|
|
|
|
|
|
string str = (string)json;
|
2024-06-30 17:47:14 -05:00
|
|
|
|
return string.IsNullOrEmpty(str) ? new OSD() : OSD.FromString(str);
|
2008-11-18 03:16:38 +00:00
|
|
|
|
case JsonType.Array:
|
|
|
|
|
|
OSDArray array = new OSDArray(json.Count);
|
|
|
|
|
|
for (int i = 0; i < json.Count; i++)
|
|
|
|
|
|
array.Add(DeserializeJson(json[i]));
|
|
|
|
|
|
return array;
|
|
|
|
|
|
case JsonType.Object:
|
|
|
|
|
|
OSDMap map = new OSDMap(json.Count);
|
2009-08-06 19:37:33 +00:00
|
|
|
|
IDictionaryEnumerator e = ((IOrderedDictionary)json).GetEnumerator();
|
|
|
|
|
|
while (e.MoveNext())
|
|
|
|
|
|
map.Add((string)e.Key, DeserializeJson((JsonData)e.Value));
|
2008-11-18 03:16:38 +00:00
|
|
|
|
return map;
|
|
|
|
|
|
case JsonType.None:
|
|
|
|
|
|
default:
|
|
|
|
|
|
return new OSD();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static string SerializeJsonString(OSD osd)
|
|
|
|
|
|
{
|
2010-05-25 23:07:16 +00:00
|
|
|
|
return SerializeJson(osd, false).ToJson();
|
2008-11-18 03:16:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2010-05-25 23:07:16 +00:00
|
|
|
|
public static string SerializeJsonString(OSD osd, bool preserveDefaults)
|
2008-12-10 02:54:50 +00:00
|
|
|
|
{
|
2010-05-25 23:07:16 +00:00
|
|
|
|
return SerializeJson(osd, preserveDefaults).ToJson();
|
2008-12-10 02:54:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2010-05-25 23:07:16 +00:00
|
|
|
|
public static void SerializeJsonString(OSD osd, bool preserveDefaults, ref JsonWriter writer)
|
|
|
|
|
|
{
|
|
|
|
|
|
SerializeJson(osd, preserveDefaults).ToJson(writer);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static JsonData SerializeJson(OSD osd, bool preserveDefaults)
|
2008-11-18 03:16:38 +00:00
|
|
|
|
{
|
|
|
|
|
|
switch (osd.Type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case OSDType.Boolean:
|
|
|
|
|
|
return new JsonData(osd.AsBoolean());
|
|
|
|
|
|
case OSDType.Integer:
|
|
|
|
|
|
return new JsonData(osd.AsInteger());
|
|
|
|
|
|
case OSDType.Real:
|
|
|
|
|
|
return new JsonData(osd.AsReal());
|
|
|
|
|
|
case OSDType.String:
|
|
|
|
|
|
case OSDType.Date:
|
|
|
|
|
|
case OSDType.URI:
|
|
|
|
|
|
case OSDType.UUID:
|
2009-04-09 01:17:40 +00:00
|
|
|
|
return new JsonData(osd.AsString());
|
2008-11-18 03:16:38 +00:00
|
|
|
|
case OSDType.Binary:
|
2009-04-09 01:17:40 +00:00
|
|
|
|
byte[] binary = osd.AsBinary();
|
|
|
|
|
|
JsonData jsonbinarray = new JsonData();
|
|
|
|
|
|
jsonbinarray.SetJsonType(JsonType.Array);
|
2017-03-12 09:51:41 -05:00
|
|
|
|
foreach (byte t in binary)
|
|
|
|
|
|
jsonbinarray.Add(new JsonData(t));
|
2009-04-09 01:17:40 +00:00
|
|
|
|
return jsonbinarray;
|
2008-11-18 03:16:38 +00:00
|
|
|
|
case OSDType.Array:
|
|
|
|
|
|
JsonData jsonarray = new JsonData();
|
2009-02-04 23:00:33 +00:00
|
|
|
|
jsonarray.SetJsonType(JsonType.Array);
|
2008-11-18 03:16:38 +00:00
|
|
|
|
OSDArray array = (OSDArray)osd;
|
2017-03-12 09:51:41 -05:00
|
|
|
|
foreach (OSD t in array)
|
|
|
|
|
|
jsonarray.Add(SerializeJson(t, preserveDefaults));
|
2008-11-18 03:16:38 +00:00
|
|
|
|
return jsonarray;
|
|
|
|
|
|
case OSDType.Map:
|
|
|
|
|
|
JsonData jsonmap = new JsonData();
|
2009-02-04 23:00:33 +00:00
|
|
|
|
jsonmap.SetJsonType(JsonType.Object);
|
2008-11-18 03:16:38 +00:00
|
|
|
|
OSDMap map = (OSDMap)osd;
|
|
|
|
|
|
foreach (KeyValuePair<string, OSD> kvp in map)
|
2009-12-02 20:51:01 +00:00
|
|
|
|
{
|
2017-03-12 09:51:41 -05:00
|
|
|
|
var data = preserveDefaults
|
|
|
|
|
|
? SerializeJson(kvp.Value, preserveDefaults)
|
|
|
|
|
|
: SerializeJsonNoDefaults(kvp.Value);
|
2010-05-25 23:07:16 +00:00
|
|
|
|
|
2009-12-02 20:51:01 +00:00
|
|
|
|
if (data != null)
|
|
|
|
|
|
jsonmap[kvp.Key] = data;
|
|
|
|
|
|
}
|
2008-11-18 03:16:38 +00:00
|
|
|
|
return jsonmap;
|
|
|
|
|
|
case OSDType.Unknown:
|
|
|
|
|
|
default:
|
2010-06-05 14:12:24 +00:00
|
|
|
|
return new JsonData(null);
|
2008-11-18 03:16:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2009-12-02 20:51:01 +00:00
|
|
|
|
|
|
|
|
|
|
private static JsonData SerializeJsonNoDefaults(OSD osd)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (osd.Type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case OSDType.Boolean:
|
|
|
|
|
|
bool b = osd.AsBoolean();
|
2017-03-12 09:51:41 -05:00
|
|
|
|
return !b ? null : new JsonData(b);
|
2009-12-02 20:51:01 +00:00
|
|
|
|
|
|
|
|
|
|
case OSDType.Integer:
|
|
|
|
|
|
int v = osd.AsInteger();
|
2017-03-12 09:51:41 -05:00
|
|
|
|
return v == 0 ? null : new JsonData(v);
|
2009-12-02 20:51:01 +00:00
|
|
|
|
|
|
|
|
|
|
case OSDType.Real:
|
|
|
|
|
|
double d = osd.AsReal();
|
2017-03-12 09:51:41 -05:00
|
|
|
|
return d == 0.0d ? null : new JsonData(d);
|
2009-12-02 20:51:01 +00:00
|
|
|
|
|
|
|
|
|
|
case OSDType.String:
|
|
|
|
|
|
case OSDType.Date:
|
|
|
|
|
|
case OSDType.URI:
|
|
|
|
|
|
string str = osd.AsString();
|
2024-06-30 17:47:14 -05:00
|
|
|
|
return string.IsNullOrEmpty(str) ? null : new JsonData(str);
|
2009-12-02 20:51:01 +00:00
|
|
|
|
|
|
|
|
|
|
case OSDType.UUID:
|
|
|
|
|
|
UUID uuid = osd.AsUUID();
|
2017-03-12 09:51:41 -05:00
|
|
|
|
return uuid == UUID.Zero ? null : new JsonData(uuid.ToString());
|
2009-12-02 20:51:01 +00:00
|
|
|
|
|
|
|
|
|
|
case OSDType.Binary:
|
|
|
|
|
|
byte[] binary = osd.AsBinary();
|
|
|
|
|
|
if (binary == Utils.EmptyBytes)
|
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
|
|
JsonData jsonbinarray = new JsonData();
|
|
|
|
|
|
jsonbinarray.SetJsonType(JsonType.Array);
|
2017-03-12 09:51:41 -05:00
|
|
|
|
foreach (byte t in binary)
|
|
|
|
|
|
jsonbinarray.Add(new JsonData(t));
|
2009-12-02 20:51:01 +00:00
|
|
|
|
return jsonbinarray;
|
|
|
|
|
|
case OSDType.Array:
|
|
|
|
|
|
JsonData jsonarray = new JsonData();
|
|
|
|
|
|
jsonarray.SetJsonType(JsonType.Array);
|
|
|
|
|
|
OSDArray array = (OSDArray)osd;
|
2017-03-12 09:51:41 -05:00
|
|
|
|
foreach (OSD t in array)
|
|
|
|
|
|
jsonarray.Add(SerializeJson(t, false));
|
2009-12-02 20:51:01 +00:00
|
|
|
|
return jsonarray;
|
|
|
|
|
|
case OSDType.Map:
|
|
|
|
|
|
JsonData jsonmap = new JsonData();
|
|
|
|
|
|
jsonmap.SetJsonType(JsonType.Object);
|
|
|
|
|
|
OSDMap map = (OSDMap)osd;
|
|
|
|
|
|
foreach (KeyValuePair<string, OSD> kvp in map)
|
|
|
|
|
|
{
|
|
|
|
|
|
JsonData data = SerializeJsonNoDefaults(kvp.Value);
|
|
|
|
|
|
if (data != null)
|
|
|
|
|
|
jsonmap[kvp.Key] = data;
|
|
|
|
|
|
}
|
|
|
|
|
|
return jsonmap;
|
|
|
|
|
|
case OSDType.Unknown:
|
|
|
|
|
|
default:
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2008-11-18 03:16:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|