|
@@ -343,16 +343,42 @@ public class LsyOnboardingService {
|
|
|
* 上游示例里第二项**就是没有 {@code shop_tel} 键**(另一条路径:{@code Map.get} 给 Java
|
|
* 上游示例里第二项**就是没有 {@code shop_tel} 键**(另一条路径:{@code Map.get} 给 Java
|
|
|
* {@code null},不过 {@code asText} 的话同样会变成字符串 {@code "null"})。
|
|
* {@code null},不过 {@code asText} 的话同样会变成字符串 {@code "null"})。
|
|
|
*
|
|
*
|
|
|
- * <p>★ <b>为什么不去把解析器改成递归</b>(另一条路):那会动到 Task 1-4 与批次一
|
|
|
|
|
- * **全部**路径的返回形状,超出本 task 边界。
|
|
|
|
|
- * <br>★ <b>这是对解析器那条注释的一次<u>有意偏离</u></b>,逐字记清楚免得后来人以为它同意了:
|
|
|
|
|
- * {@code LeshouyingResponseParser.toMap} 的注释里写的是
|
|
|
|
|
|
|
+ * <p>★ <b>这是对解析器那条注释的一次<u>有意偏离</u></b>,逐字记清楚免得后来人以为它同意了:
|
|
|
|
|
+ * {@code LeshouyingResponseParser.toMap} 的注释写的是
|
|
|
* 「<b>谁要开始读嵌套字段,先回来把这里改成递归</b>」—— 它给的路是**改它**;
|
|
* 「<b>谁要开始读嵌套字段,先回来把这里改成递归</b>」—— 它给的路是**改它**;
|
|
|
- * 本 task 按派发件的裁定走了另一条(在读取点归一),理由是改动面:改解析器要同时动
|
|
|
|
|
- * 批次一(支付/回调/退款)全部消费方,而本批次一处都不碰。
|
|
|
|
|
- * <br>代价与再评估条件一起记着:**每个**读嵌套字段的消费方都得自己记得过 {@code asText},
|
|
|
|
|
- * 漏一处就是一条静默的字符串 {@code "null"}。**消费方到 3 处就该反过来做**——
|
|
|
|
|
- * 那时把解析器改递归,并删掉这里的 {@code JSONNull} 分支(两处都留会变成两份口径)。
|
|
|
|
|
|
|
+ * 本 task 按派发件的裁定走了另一条(在读取点归一),因为本 task 的边界不允许动
|
|
|
|
|
+ * {@code client/} 里那条既有行为。
|
|
|
|
|
+ *
|
|
|
|
|
+ * <p>★ <b>那条路真实的作用面</b>(2026-09-22 实测,不是估的;将来重新评估「要不要翻面」
|
|
|
|
|
+ * 请用下面三条去算账,**不要**再沿用「翻面要动批次一全部消费方」这种没量过的说法):
|
|
|
|
|
+ * <ol>
|
|
|
|
|
+ * <li>{@code toMap} 的实现是逐键替换顶层值
|
|
|
|
|
+ * ({@code map.put(k, v instanceof JSONNull ? null : v)})⇒ 递归化**只改嵌套结构
|
|
|
|
|
+ * 内部的值,不改任何顶层键的值**,只读顶层键的既有消费方(payPatch、回调、
|
|
|
|
|
+ * {@code LsyQueryDetailAssembler} 的白名单 {@code get})**读到的东西不变**。
|
|
|
|
|
+ * (唯一会变的形态是把整张已解析的 map 原样序列化或打印 —— 本模块没有这种用法。)</li>
|
|
|
|
|
+ * <li>全模块读嵌套字段的只有两个方法({@link #toAreaItems} 与本方法):4 个
|
|
|
|
|
+ * {@code instanceof Map/List} 守卫 + 6 个元素字段读取,**全部**过 {@code asText};
|
|
|
|
|
+ * main 里出现 {@code JSONObject}/{@code JSONArray} 的地方只有解析器自己。</li>
|
|
|
|
|
+ * <li>递归化后这两处守卫照样成立:{@code JSONObject} 经 {@code MapWrapper} 实现 {@code Map}、
|
|
|
|
|
+ * {@code JSONArray} 直接实现 {@code java.util.List}(javap hutool-all 5.8.34 实测)
|
|
|
|
|
+ * ⇒ 容器仍是 List、元素仍是 Map;变成死代码的只有 {@link #asText} 的 {@code JSONNull} 分支。</li>
|
|
|
|
|
+ * </ol>
|
|
|
|
|
+ * <b>推断(未实测,别当读数用)</b>:按上面三条,翻面后全量应当只有一条测试会红 ——
|
|
|
|
|
+ * {@code LeshouyingResponseParserTest.parseV3_normalization_isTopLevelOnly_nestedJsonNullSurvives}
|
|
|
|
|
+ * (它的 {@code assertInstanceOf(JSONObject.class, nested)} 与「嵌套里的 null 没有被归一化」
|
|
|
|
|
+ * 两句钉的就是这条边界本身)。要把这个推断变成读数就跑:
|
|
|
|
|
+ * {@code C:\Users\1\tools\apache-maven-3.9.16\bin\mvn.cmd -f java\pom.xml test}
|
|
|
|
|
+ * (先把 {@code target/classes} 下 parser 的 class 删掉强制重编,再逐条比对失败清单)。
|
|
|
|
|
+ *
|
|
|
|
|
+ * <p>★ <b>再评估条件(结构性触发,不靠计数)</b>:**下一次有人动
|
|
|
|
|
+ * {@code LeshouyingResponseParser},就把递归化一并做掉**,同时删掉本类的 {@code JSONNull}
|
|
|
|
|
+ * 分叉({@link #asText} 的分支 + 两处读取点的说明)—— 两处都留会变成两份口径。
|
|
|
|
|
+ * 触发点挂在「动解析器」这个**必然会发生**的事件上。**不要**换成数「有几个消费方记得过
|
|
|
|
|
+ * {@code asText}」:那种计数只对**记得**的消费方 +1,而危害恰恰来自**忘了**的
|
|
|
|
|
+ * ⇒ 计数器的触发条件与它要防的失败模式正交,永远不会响。
|
|
|
|
|
+ * <br>在这之前,代价照旧记着:**每个**读嵌套字段的消费方都得自己记得过 {@code asText},
|
|
|
|
|
+ * 漏一处就是一条静默的字符串 {@code "null"}(长度 4)。
|
|
|
*/
|
|
*/
|
|
|
private static List<LsyShopItemDTO> toShopItems(Map<String, Object> resp) {
|
|
private static List<LsyShopItemDTO> toShopItems(Map<String, Object> resp) {
|
|
|
Object raw = resp.get("shop_list");
|
|
Object raw = resp.get("shop_list");
|