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
WebHttpBinding
endpoint to respond with the JSON string. Yeah, it adds a call but it'll simplify your contracts.