Darabonba/Utils/JSONUtils.cs (161 lines of code) (raw):
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace Darabonba.Utils
{
public static class JSONUtils
{
public static string SerializeObject(object data)
{
if (data is string)
{
return data.ToString();
}
return JsonConvert.SerializeObject(data);
}
public static object Deserialize(object obj)
{
if (obj == null)
{
return null;
}
if (obj is JArray)
{
return DeserializeJArray((JArray) obj);
}
else if (obj is JObject)
{
return DeserializeJObject((JObject) obj);
}
else
{
return obj;
}
}
public static Dictionary<string, object> ParseToMap(object input)
{
if (input == null)
{
return null;
}
var type = input.GetType();
var map = (Dictionary<string, object>)ModelExtensions.ToMapFactory(type, input);
return map;
}
private static Dictionary<string, object> DeserializeJObject(JObject obj)
{
Dictionary<string, object> dic = new Dictionary<string, object>();
Dictionary<string, object> dicJObj = obj.ToObject<Dictionary<string, object>>();
foreach (var keypair in dicJObj)
{
dic.Add(keypair.Key, Deserialize(keypair.Value));
}
return dic;
}
private static List<object> DeserializeJArray(JArray obj)
{
if (obj.Count == 0)
{
return new List<object>();
}
if (obj[0].Type == JTokenType.Object)
{
List<object> dicList = new List<object>();
List<Dictionary<string, object>> dicObjList = obj.ToObject<List<Dictionary<string, object>>>();
foreach (Dictionary<string, object> objItem in dicObjList)
{
Dictionary<string, object> objDict = new Dictionary<string, object>();
foreach (var keypair in objItem)
{
objDict.Add(keypair.Key, Deserialize(keypair.Value));
}
dicList.Add(objDict);
}
return dicList;
}
else if (obj[0].Type == JTokenType.Array)
{
List<object> dicObjList = obj.ToObject<List<object>>();
List<object> dicList = new List<object>();
foreach (var item in dicObjList)
{
dicList.Add(Deserialize((JArray) item));
}
return dicList;
}
else
{
List<object> dicObjList = obj.ToObject<List<object>>();
return dicObjList;
}
}
public static object ReadPath(object obj, string path)
{
object result;
string jsonStr;
if (obj is JObject)
{
jsonStr = JsonConvert.SerializeObject(obj);
result = JObject.Parse(jsonStr).SelectToken(path);
}
else
{
jsonStr = SerializeObject(ParseToMap(obj));
result = JObject.Parse(jsonStr).SelectToken(path);
}
return ConvertNumber(result);
}
private static object ConvertNumber(object input)
{
if (input == null) return null;
var token = input as JToken;
if (token != null)
{
if (token.Type == JTokenType.Integer)
{
return token.ToObject<long>();
}
if (token.Type == JTokenType.Float)
{
return token.ToObject<double>();
}
if (token.Type == JTokenType.String)
{
return token.ToString();
}
if (token.Type == JTokenType.Array)
{
return HandleList(token.Children());
}
if (token.Type == JTokenType.Object)
{
return HandleMap(token.ToObject<Dictionary<string, object>>());
}
if (token.Type == JTokenType.Boolean)
{
return token.ToObject<bool>();
}
}
return input;
}
private static object HandleList(IEnumerable<JToken> list)
{
var convertedList = new List<object>();
foreach (var item in list)
{
convertedList.Add(ConvertNumber(item));
}
return convertedList;
}
private static object HandleMap(IDictionary<string, object> map)
{
var convertedMap = new Dictionary<string, object>();
foreach (var entry in map)
{
convertedMap[entry.Key] = ConvertNumber(entry.Value);
}
return convertedMap;
}
}
}