Skip to content

Commit 5ad7e32

Browse files
committed
修复解析的json中存在空数组时导致的数组越界问题,此时生成的代码将用List<dynamic>方式处理;优化当数组中的元素为基本数据类型时生成的代码
1 parent 010dc1a commit 5ad7e32

File tree

2 files changed

+26
-10
lines changed

2 files changed

+26
-10
lines changed

formater.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,18 +133,25 @@ def update_list(json_str):
133133

134134
ui.tv_fields.setRowCount(len(res))
135135

136+
pre_type_combobox = None
137+
ii = 0
136138
for i in range(len(res)):
137139
line = res[i]
138140
assert isinstance(line, str)
139141
index = line.find('<')
140-
141-
ui.tv_fields.setCellWidget(i, 1, get_type_combobox(line))
142+
temp_type_combobox = get_type_combobox(line)
143+
ui.tv_fields.setCellWidget(ii, 1, temp_type_combobox)
144+
if temp_type_combobox.count() > 1 and pre_type_combobox is not None and pre_type_combobox.currentText().startswith('List'):
145+
ui.tv_fields.setRowCount(ui.tv_fields.rowCount() - 1)
146+
pre_type_combobox = temp_type_combobox
147+
continue
148+
pre_type_combobox = temp_type_combobox
142149
if line.strip() == '<[dict]>8':
143150
label = QtWidgets.QLabel("")
144151
label.setStyleSheet("background-color: rgb(200,200,200);")
145-
ui.tv_fields.setCellWidget(i, 2, label)
152+
ui.tv_fields.setCellWidget(ii, 2, label)
146153
else:
147-
ui.tv_fields.setCellWidget(i, 2, get_name_text_edit(line))
154+
ui.tv_fields.setCellWidget(ii, 2, get_name_text_edit(line))
148155

149156
if index == 0:
150157
field = line.replace('<', '').replace('>', '')
@@ -155,7 +162,8 @@ def update_list(json_str):
155162
label.setText(field[0:60] + '...' if len(field) > 60 else field[0:-1])
156163
label.setToolTip(field[0:-1])
157164

158-
ui.tv_fields.setCellWidget(i, 0, label)
165+
ui.tv_fields.setCellWidget(ii, 0, label)
166+
ii += 1
159167

160168
ui.tv_fields.resizeColumnToContents(0)
161169

@@ -184,6 +192,7 @@ def generate_bean():
184192

185193
bean.append([var_field, var_type, var_name])
186194

195+
check_and_generate_code(bean)
187196
try:
188197
res = check_and_generate_code(bean)
189198
except IndexError as e:

tools.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
# 验证json字符串是否合法
1616
def is_json(myjson):
1717
try:
18-
json.loads(myjson)
18+
j = json.loads(myjson)
1919
except ValueError:
2020
return False
21-
return True
21+
if type(j) in (list, dict):
22+
return True
23+
return False
2224

2325

2426
# 传入未格式化的单行json字符串,返回指定缩进的多行json字符串
@@ -75,7 +77,10 @@ def build_list_construction(f, t, n):
7577
code = list_code_loop(code, i, total, n, class_type)
7678

7779
# 嵌套模板的后续处理
78-
code = code.replace('%s%s' % (n, 'Child' * total), 'new %s(%s%s)' % (class_type, n, ('Item' * total)))
80+
if check_level_type(class_type) not in (1, 2) and class_type != '':
81+
code = code.replace('%s%s' % (n, 'Child' * total), 'new %s(%s%s)' % (class_type, n, ('Item' * total)))
82+
else:
83+
code = code.replace('%s' % ('Child' * total), '%s' % ('Item' * total))
7984
code = code[code.find(';') + 1:]
8085
code = code.replace('%s){' % n, 'jsonRes[\'%s\']){' % n).replace('${loop}', '')
8186

@@ -140,10 +145,10 @@ def build_level_code(level_bean):
140145
child_bean.append(level_bean.pop(0))
141146
build_level_code(child_bean)
142147
# 数据类型为数组时
143-
if check_level_type(t) == 3:
148+
if check_level_type(t) == 3 and len(level_bean) > 0:
144149
generic_type = level_bean[0][2].replace('List<', '').replace('>', '')
145150
# 如果List的里层数据为dict则对其去壳后处理
146-
if check_level_type(generic_type) == 4:
151+
if check_level_type(generic_type) == 4 and generic_type != '':
147152
while check_level_type(level_bean[0][2]) == 3:
148153
work_level = level_bean[0][0]
149154
level_bean.pop(0)
@@ -183,6 +188,8 @@ def generate_code(work_bean):
183188
if is_list_top:
184189
res = res.replace('jsonRes[\'list\']', 'jsonRes', 1)
185190

191+
# 如果json中存在空list这种操蛋情况,将list类型从list<>修改成list<dynamic>
192+
res = res.replace('List<>', 'List<dynamic>')
186193
# 最终修改,添加jsonStr解析为jsonRes代码
187194
bp = res.find('(jsonRes) {')
188195
return 'import \'dart:convert\' show json;\n' + res[:bp] + '(jsonStr) {\n var jsonRes = json.decode(jsonStr);\n' + res[bp + 11:]

0 commit comments

Comments
 (0)