It was a pretty simple example - summarised in this graphic:
Footheory's post on Automatic Properties jogged my memory on how the compiler 'deals with' Automatic Properties... so the WCF JSON serializer is (for some reason) emitting the underlying field names whereas ASMX seems quite happy to emit the 'intended' name.
The fix was simple - add the WCF-specific
DataMemberattribute to the properties...
...and voila! they are again emitted in JSON as
Code, Id, Price, etc.
It's probably easy to track down (now that Microsoft has made the source-code available) why this is happening; but for now I'm just happy it was an easy (if slightly unintuitive) fix. If you are converting ASMX web services to WCF and find BackingField popping up unexpectedly in your classes, adding the
DataContractattributes might just restore your sanity.
EDIT 7-May-08: I haven't gotten around to adding a Silverlight 2.0 example, but the concepts are all covered in Tim Heuer's Making use of your JSON data in Silverlight post.