private JToken ItemToJson(StackItemBase item) { if (item == null) { return(null); } JToken value; using (item) { switch (item.Type) { case EStackItemType.Bool: value = new JValue((bool)item.ToObject()); break; case EStackItemType.Integer: value = new JValue(item.ToObject().ToString()); break; case EStackItemType.ByteArray: value = new JValue((byte[])item.ToObject()); break; case EStackItemType.Interop: value = new JValue(item.ToObject().ToString()); break; case EStackItemType.Struct: case EStackItemType.Array: { var array = (ArrayStackItemBase)item; var jarray = new JArray(); foreach (var entry in array) { jarray.Add(ItemToJson(entry)); } value = jarray; break; } case EStackItemType.Map: { var dic = (MapStackItemBase)item; var jdic = new JObject(); foreach (var entry in dic) { jdic.Add(entry.Key.ToByteArray().ToHexString(true), ItemToJson(entry.Value)); } value = jdic; break; } default: throw new NotImplementedException(); } return(new JObject { ["type"] = item.Type.ToString(), ["value"] = value }); } }