ОБНОВЛЕНИЕ 10/19/2010 Я знаю, что я задал этот вопрос некоторое время назад, но обходные пути, показанные в этих ответах, вряд ли удовлетворительны, и это по-прежнему является общей проблемой для многих. WCF просто не является гибким. Я начал свою собственную библиотеку С# с открытым исходным кодом для создания служб REST без WCF. Проверьте restcake.net или rest.codeplex.com для получения информации об этом библиотека. END UPDATE
ОБНОВЛЕНИЕ 8/2/2012 ASP.NET Web API (ранее WCF Web API, замена REST WCF) использует Json.NET по умолчанию END UPDATE
DataContractJsonSerializer
не может обрабатывать многие сценарии, в которых Json.Net обрабатывает только штраф при правильной настройке (в частности, циклов).
Метод службы может либо возвращать определенный тип объекта (в этом случае DTO), и в этом случае используется DataContractJsonSerializer
, или я могу заставить метод вернуть строку, а сама сериализация с Json.Net. Проблема в том, что когда я возвращаю json-строку в отличие от объекта, json, который отправляется клиенту, заключен в кавычки.
Используя DataContractJsonSerializer
, возвращая определенный тип объекта, ответ будет следующим:
{"Message":"Hello World"}
Используя Json.Net для возврата строки json, ответ будет следующим:
"{\"Message\":\"Hello World\"}"
Я не хочу иметь для eval() или JSON.parse() результат на клиенте, и это то, что мне нужно было бы сделать, если json вернется как строка, завернутая в кавычки. Я понимаю, что поведение правильное; это просто не то, что я хочу/нуждаюсь. Мне нужен сырой json; поведение, когда возвращаемый тип метода службы является объектом, а не строкой.
Итак, как я могу вернуть метод методу типа объекта, но не использовать DataContractJsonSerializer? Как я могу сказать, чтобы вместо этого использовать сериализатор Json.Net?
Или, может ли кто-нибудь непосредственно написать ответный поток? Значит, я могу просто вернуть сырого json? Без кавычек обертывания?
Вот мой надуманный пример, для справки:
[DataContract]
public class SimpleMessage
{
[DataMember]
public string Message { get; set; }
}
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PersonService
{
// uses DataContractJsonSerializer
// returns {"Message":"Hello World"}
[WebGet(UriTemplate = "helloObject")]
public SimpleMessage SayHelloObject()
{
return new SimpleMessage("Hello World");
}
// uses Json.Net serialization, to return a json string
// returns "{\"Message\":\"Hello World\"}"
[WebGet(UriTemplate = "helloString")]
public string SayHelloString()
{
SimpleMessage message = new SimpleMessage() { Message = "Hello World" };
string json = JsonConvert.Serialize(message);
return json;
}
// I need a mix of the two. Return an object type, but use the Json.Net serializer.
}