我正在制作自定义JSON文件编辑器。 为了更好地管理数据,我想创建一棵树。 为了使用它们管理数据,默认的JToken和JObject对我来说太复杂了。这就是为什么我要将从输入文件创建的JObject转换为树的原因。
我的代码的基本原理是: 您将JToken传递给Container对象的构造函数; 容器对象包含List(类型为Container)child_containers; 如果JToken是复杂的而不是原始的,它将遍历所有子JToken JToken and它使用该子JToken创建新的Container,并将其添加到child_containers列表。如果输入JToken是原始的,它将保存其值并停止递归。
public class Container
{
protected GraphicalBlock graphicalBlock;
//Universal usage
protected bool IsOriginObject;
//For primitive containers
protected object PrimitiveContent;
//For complex containers
protected Container child_container;
protected List<Container> child_elements;
/// <summary>
/// Constructor when provided with raw jobject will create a tree that allows easy data managment.
/// Constructor is only called once, after that the whole tree will be created recusivly
/// </summary>
/// <param name="input_jobject"></param>
/// <param name="Is_orig_obj"></param>
public Container(JToken input_jobject, Point loc, Form main_form_ref, bool Is_orig_obj=true)
{
IsOriginObject = Is_orig_obj;
//Check for complex vs primitive
if(input_jobject.HasValues)
{
//Populate children list with next level/tier tokens
//Every token will execute the same procedure eventualy creating a tree
//The main container is the origin of the tree, primitive containers are the end of the branches
int i = 0;
JObject job = input_jobject as JObject;
foreach (KeyValuePair<string, JToken> pair in job)
{
child_elements.Add(new Container(pair.Value, new Point(loc.X + i, loc.Y+120) ,main_form_ref, false));
i=+120;
}
graphicalBlock = new GraphicalBlock(loc, true, main_form_ref, this);
}
else
{
//If token is primitive we can extract value from it
PrimitiveContent = input_jobject.ToObject<object>();
graphicalBlock = new GraphicalBlock(loc, false, main_form_ref, this);
}
}
}
graphicalBlock对象只是我用于添加GUI的精美包装。 我不认为这会影响循环。
主要问题是在第一次迭代和创建第一个子容器之后,循环以某种方式中断。有人可以解释为什么第一个令牌后foreach循环中断吗? (没有输入的JToken仅包含1个值)。
如果有人对我的代码有任何疑问,请不要犹豫。 我的问题非常具体,因此我无法在Google上或使用搜索工具找到它。
答案 0 :(得分:0)
与线
protected List<Container> child_elements;
您要声明一个类型为List<Container>
的名称为“ child_element”的字段,但是尚未创建(实例化)列表。因此,该字段的默认值为null
。
然后您尝试向该“列表”中添加一些内容
child_elements.Add(new Container(...
您成功创建了该子容器,但由于添加的列表不存在而失败。您可能会得到一个被隐藏的NullReferenceException(在调用者处尝试/捕获?)。
解决方案:通过这样声明来确保该字段确实包含列表:
protected List<Container> child_elements = new List<Container>();