@@ -29,23 +29,41 @@ namespace NekoGui {
2929 return tun_name;
3030 }
3131
32- void MergeJson (const QJsonObject &custom, QJsonObject &outbound ) {
32+ void MergeJson (QJsonObject &dst, const QJsonObject &src ) {
3333 // 合并
34- if (custom .isEmpty ()) return ;
35- for (const auto &key: custom .keys ()) {
36- if (outbound. contains (key)) {
37- auto v = custom[ key];
38- auto v_orig = outbound [key];
39- if (v .isObject () && v_orig .isObject ()) { // isObject 则合并?
40- auto vo = v .toObject ();
41- QJsonObject vo_orig = v_orig .toObject ();
42- MergeJson (vo, vo_orig );
43- outbound [key] = vo_orig ;
34+ if (src .isEmpty ()) return ;
35+ for (const auto &key: src .keys ()) {
36+ auto v_src = src[key];
37+ if (dst. contains ( key)) {
38+ auto v_dst = dst [key];
39+ if (v_src .isObject () && v_dst .isObject ()) { // isObject 则合并?
40+ auto v_src_obj = v_src .toObject ();
41+ auto v_dst_obj = v_dst .toObject ();
42+ MergeJson (v_dst_obj, v_src_obj );
43+ dst [key] = v_dst_obj ;
4444 } else {
45- outbound[key] = v;
45+ dst[key] = v_src;
46+ }
47+ } else if (v_src.isArray ()) {
48+ if (key.startsWith (" +" )) {
49+ auto key2 = SubStrAfter (key, " +" );
50+ auto v_dst = dst[key2];
51+ auto v_src_arr = v_src.toArray ();
52+ auto v_dst_arr = v_dst.toArray ();
53+ QJSONARRAY_ADD (v_src_arr, v_dst_arr)
54+ dst[key2] = v_src_arr;
55+ } else if (key.endsWith (" +" )) {
56+ auto key2 = SubStrBefore (key, " +" );
57+ auto v_dst = dst[key2];
58+ auto v_src_arr = v_src.toArray ();
59+ auto v_dst_arr = v_dst.toArray ();
60+ QJSONARRAY_ADD (v_dst_arr, v_src_arr)
61+ dst[key2] = v_dst_arr;
62+ } else {
63+ dst[key] = v_src;
4664 }
4765 } else {
48- outbound [key] = custom[key] ;
66+ dst [key] = v_src ;
4967 }
5068 }
5169 }
@@ -68,7 +86,7 @@ namespace NekoGui {
6886 }
6987
7088 // apply custom config
71- MergeJson (QString2QJsonObject (ent->bean ->custom_config ), result-> coreConfig );
89+ MergeJson (result-> coreConfig , QString2QJsonObject (ent->bean ->custom_config ));
7290
7391 return result;
7492 }
@@ -342,7 +360,7 @@ namespace NekoGui {
342360 }
343361
344362 // apply custom outbound settings
345- MergeJson (QString2QJsonObject (ent->bean ->custom_outbound ), outbound );
363+ MergeJson (outbound, QString2QJsonObject (ent->bean ->custom_outbound ));
346364
347365 // Bypass Lookup for the first profile
348366 auto serverAddress = ent->bean ->serverAddress ;
0 commit comments