은밀한 전치 의존

1878 단어

수수께끼


다음 코드에 문제가 있습니까?
Map extraMap;  //   

Boolean isItemIncluded = isItemIncludingTax(extraMap.toString());

private Boolean isItemIncludingTax(String extra) {
     JSONObject itemExtra = JSONObject.parseObject(extra);
     return itemExtra.containsKey("tax") && "1".equals(itemExtra.get("tax"));
}

간단한 단일 테스트를 통해 다음을 확인합니다.
public class MapStringParserTest {

  @Test
  public void testParse() {
    Map map = new HashMap<>();
    map.put("a", "{\"outer\":1}");
    System.out.println(map);

    JSONObject parsed = JSONObject.parseObject(map.toString());
    System.out.println(parsed.getString("a"));
  }
}

결과 출력:
{a={"outer":1}}

com.alibaba.fastjson.JSONException: expect ':' at 0, actual =

    at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:290)

이상하게 던졌어.
그런데 이상하게도 프로그램이 정상적으로 작동하고 있었다.왜?맞춰봐.

수수께끼


전치의존이 있어서요.

    orderItemFormatBO.setExtraMap(getExtraMap(extra));

    protected Map getExtraMap(String extraJson){
        if(StringUtils.isNoneEmpty(extraJson)){
            try {
                return JSON.parseObject(extraJson);
            }catch (Exception e){
                logger.error("extra fomat not valid:{}", extraJson, e);
            }
        }
        return null;
    }

설정할 때 extraMap은 JSONObject 대상으로 설정되고 toString을 호출할 때 멀티태스킹에 따라 JSONObject의 멀티태스킹 방법이 호출됩니다.이제야 문제 없어요. 
   public String toString() {
      return this.toJSONString();
   }

좋은 초거리 호응!extraMap이 새로운 비JSONObject의 Map으로 다시 설정되면 반드시 문제가 발생할 것입니다.
요행으로 피하지 마라, 비록 재난을 피했지만, 다음에는 행운으로 피할 수 있겠는가?

좋은 웹페이지 즐겨찾기