Отключить ввод типов в WCF JSON Services
У меня есть то, что должно быть относительно простым вопросом, на который я не могу найти ответа.
Когда WCF выполняет сериализацию объектов, он автоматически применяет Type Hinting. Для служб Json это приводит к дополнительному полю для каждого сложного объекта с именем __type
. Объект, определенный как:
[DataContract]
public class SomeObject
{
[DataMember]
public string First { get; set; }
[DataMember]
public string Last { get; set; }
}
Будет сериализован примерно так:
{
"First" : "Hello",
"Last" : "World!",
"__type" : "SomeObject#MyNamespace.SomeObject"
}
Обычно это не проблема. К сожалению, когда вы начинаете вкладывать классы в довольно большие и сложные структуры, это приводит к тонне накладных расходов в размере ответа JSON, возвращаемого клиенту.
Конечно, должен быть способ отключить это поведение, но я не смог его найти (ни Rick Strahl еще в 2007 году... но это 2010, и я надеюсь, что кто-то это понял).
Ответы
Ответ 1
Использование DataContractJsonSerializer
будет хотеть сделать это для поддержки полиморфизма и возможности десериализации обратно к известному типу. NewtonSoft является сторонним json-сериализатором, который не будет добавлять подсказку __type. Если вы просто сериализуете и не используете реальные атрибуты DataContract, вы можете попробовать попробовать.
Ответ 2
Я предполагаю, что вы используете <enableWebScript/>
в своей конфигурации поведения, замените это на <webHttp defaultOutgoingResponseFormat="Json"/>
, и вы получите хороший и чистый json
Ответ 3
Это сделало трюк для меня:
[WebGet(ResponseFormat=WebMessageFormat.Json,BodyStyle = WebMessageBodyStyle.Bare)]
См. шаги 7 и 10 из
http://dotnetdiscoveries.blogspot.com/2008/05/return-json-from-ajax-enabled-wcf.html