Avoiding Duplicate Boilerplate Code in WCF Service
I'm not sure why your change all of a sudden would expose data to the business layer when it didn't before.

If you have a pattern of methods which look like this:

public string MyServiceCall()
{
    try
    {
        JObject incomingRequestJson = retrieveJson();
        JObject returningJson = new JObject();

        // do stuff

        return returningJson.ToString(Newtonsoft.Json.Formatting.None);
    }
    catch (Exception ex)
    {
        throw new WebFaultException&lt;string&gt;(ex.Message.ToString(), HttpStatusCode.OK);
    }
}


Then you can simply add a helper method to your service implementation:

private string ProcessServiceCall(Func&lt;JObject, JObject&gt; processor)
{
    try
    {
        JObject incomingRequestJson = retrieveJson();
        JObject returningJson = processor(incomingRequestJson);

        return returningJson.ToString(Newtonsoft.Json.Formatting.None);
    }
    catch (Exception ex)
    {
        throw new WebFaultException&lt;string&gt;(ex.Message.ToString(), HttpStatusCode.OK);
    }
}


and your service call then becomes:

public string MyServiceCall()
{
    ProcessServiceCall(incomingRequestJson =&gt; {

        string accountId = incomingRequestJson.SelectToken("accountId", true).ToString();
        string username = incomingRequestJson.SelectToken("userName", true).ToString();
        string password = incomingRequestJson.SelectToken("password", true).ToString();

        JObject result = new JObject();

        LoginResult result = readerBLL.Login(accountId, username, password);
        result.Add(new JProperty("userSessionId", result.userSessionId));
        result.Add(new JProperty("friendlyUserName", result.friendlyUserName));

        return result;
    }
}


This should be a simple refactoring on your service class and not expose any more json to the business logic than before.