at the project I am working on, we have a requirement to have a DataContract that can contain some undefined JSON.
The DataMember is some JSON that makes sense to the client only. We want to allow the client to send us json we do not know about.
Example:
public class Contract
{
[DataMember]
public int clientId;
[DataMember]
public string json;
}
Obviously, having a contract defined like that would require the client to escape the json like this:
{
"clientId":1,
"json": "{\"test\":\"json\"}"
}
Obviously, this is not what we need. The json the client should sent us should look like this:
{
"clientId":1,
"json": {"test":"json"}
}
Possible solutions we investigated:
- use Stream as contract parameters for the request’s body. Works but puts the work on our side instead of using the framework.
- Defining “json” as a DynamicObject. Does not work. Was not able to get the property written properly.
- Using Newtonsoft library, change the default contract serializer in the WCF endpoint to serialize all inputs to a JObject. We mst also handle serialization on the request, and it causes problems in our application. We’d prefer to avoid this way.
Does anyone have a possible solution to this problem?
EDIT
The service offers rest json resources. It defines a single endpoint with webHttpBinding.
The operation is defined like this (stripped down for simplicity):
[WebInvoke(Method = "POST", UriTemplate = "...", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
[OperationContract]
Stream Create(Contract c);
Also, the service is decorated with following attribute:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
Thank you.
JF
WCF (as of 4.5) doesn’t support deserializing arbitrary JSON as part of a data contract. You’ll need to use another serializer which does that – JSON.NET is one which I personally like. To be able to change the serializer, you can use a different message formatter, and in the post at https://github.com/microsoftarchive/msdn-code-gallery-community-s-z/tree/master/Supporting%20different%20data%20and%20serialization%20formats%20in%20WCF I have a sample which does exactly that – replaces the default serialization used by WCF with JSON.NET.
Notice that to receive arbitrary JSON using that library, you’ll need to change the type of the "json" property to the equivalent of arbitrary JSON in JSON.NET, JToken: