You have the json-rpc part done. The block hashing algorithm explains how to generate a block. The missing piece is what does all of the information returned from the getwork command mean? Most of that info is still a mystery to me, which is why I created a link to a wiki page so maybe someone else will explain it there for us.
Otherwise building a miner just means you write a program that calls the getwork command on a bitcoind server and then uses that information as the starting point for generating a block according to the block hashing algorithm linked to above.
I do not believe there are any good explanations of how to build a miner anywhere, yet. I'm writing a bitcoin client, myself, rather than a miner, so I don't know what some of the getwork information means.
You might have to spend some time digging through the code of some other miners that call the getwork command. There's a list of 4 different miners down in the "How do I get started?" section of slush's pool page:
http://mining.bitcoin.cz/