135 lines
3.9 KiB
C#

#define Graph_And_Chart_PRO
using GraphAndChartSimpleJSON;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
namespace ChartAndGraph
{
class JsonParser : ChartParser
{
JSONNode mBaseJson;
JSONNode mRelativePath;
public JsonParser(string data)
{
mBaseJson = JSON.Parse(data);
mRelativePath = mBaseJson;
}
object GetObjectFromRoot(JSONNode root, string name)
{
string[] parents = name.Split('>');
object current = root;
for (int i = 0; current != null && i < parents.Length; i++)
{
string nextNode = parents[i];
current = GetChildObject(current, nextNode);
}
return current;
}
public override int GetArraySize(object arr)
{
var node = (JSONNode)arr;
if (node.IsArray == false)
return 0;
return node.Count;
}
public override object GetChildObject(object obj, string name)
{
var node = (JSONNode)obj;
if (name.Length <= 0)
return obj;
if (char.IsDigit(name[0])) // if it is a number then find by order , atag name cannot start with a digit
{
if (node.IsArray == false)
return null;
int index = 0;
if (int.TryParse(name, out index) == false) // try parsing the number
return null;
if (index < 0 || index >= node.Count)
return null;
return node[index];
}
if(name.Length>=2 && name[0] == '"' && name[name.Length-1] == '"')
{
name = name.Substring(1, name.Length - 2); //strip quatation marks
}
return node[name];
}
public override bool SetPathRelativeTo(string pathObject)
{
mRelativePath = (JSONNode)GetObjectFromRoot(mBaseJson, pathObject);
if (mRelativePath == null)
{
mRelativePath = mBaseJson;
return false;
}
return true;
}
public override object GetObject(string name)
{
return GetObjectFromRoot(mRelativePath, name);
}
public override string GetItem(object arr, int item)
{
var element = arr as JSONNode;
if (element == null)
return null;
var child = element[item] as JSONNode;
if (child == null)
return null;
return ObjectValue(child);
}
public override object GetItemObject(object arr, int item)
{
var element = arr as JSONNode;
if (element == null)
return null;
var child = element[item];
return child;
}
public override string ObjectValue(object obj)
{
var element = obj as JSONNode;
return element.Value;
}
public override string GetChildObjectValue(object obj, string name)
{
var element = obj as JSONNode;
if (element == null)
return null;
try
{
var child = element[name] as JSONNode;
return ObjectValue(child);
}
catch(Exception)
{
}
return null;
}
public override IEnumerable<KeyValuePair<string, object>> GetAllChildObjects(object obj)
{
var node = (JSONNode)obj;
if (node.IsObject == false)
yield break;
foreach(var key in node.Keys)
yield return new KeyValuePair<string, object>(key, node[key]);
}
}
}