I realized something about John Watson today. John doesn’t like to lie. When he has to be misleading, he tends to talk around an outright falsehood and avoid actually saying what he wants the other party to believe.
Baskerville is one huge example of this. He never actually says that he and Sherlock are there in a legitimate, official capacity with the military. He only heavily implies it, and that’s enough to get him what he wants.
We also see him hedge in this way surrounding his relationship with Sherlock. He doesn’t ever say that he’s straight and not interested in Sherlock. He says that he’s not gay and that they are not a couple. Those truths spoken in this context are intended to be misleading and conceal his real feelings.
So bearing in mind this tendency to talk around the lie, John’s speech to Mary at Christmas is very telling. He never says he forgives her. He never says he loves her. He implies those things because he wants her to believe them, but he never outright says them. And why not? Because he’s a horrible liar. He can’t say his lies aloud. So he talks around them, and lets other people draw the false conclusions.