如何将动态Json对象(数据)传递给wcf ResTful服务?

时间:2013-07-17 23:14:23

标签: c# json wcf rest

所以让我说我有一个Json数据集如下,即使这个数据的json数据(模型或结构)不是静态的,它会根据每次调用而改变,我怎样才能将一般的Json数据集传递给WCF代码的POST方法?

{
  "experience": 14746,
  "status": true,
  "name": "Aaron",
  "uuid": "3123"
}

我想从正文中使用POSTMAN或SoapUI吗?

public object PostData(string id, [FromBody] JObject data)
{
 //Do Something with data
}


public interface IPostService
{
    [OperationContract(Name = "PostData")]
    [WebInvoke(Method = "POST", UriTemplate = "/PostData?id={id}&data={data}")]
    object PostData(string id,[FromBody] JObject data);

}

任何帮助都会受到赞赏

2 个答案:

答案 0 :(得分:1)

在UriTemplate属性中指定变量数据时,您说该值变为查询字符串,而不是 BODY ,默认情况下是 WebInvokeMethod的HTTP方法属性是POST。

public object PostData(string id, string data)
{
    //Do Something with data
}


public interface IPostService
{
    [OperationContract(Name = "PostData")]
    [WebInvoke(UriTemplate = "/PostData?id={id})]
    object PostData(string id, string data);
}

然后,您可以使用Newtonsoft库将格式为Json的字符串值解析为具有动态属性的对象。您可以将Newtonsoft库与Nuget一起使用。

要了解如何使用Newtonsoft解析动态对象,请点击here

答案 1 :(得分:1)

  

补充我之前的回答。反序列化对象时,Newtonsoft可以与动态一起使用。以这种方式执行。

var results = JsonConvert.DeserializeObject<dynamic>(json);
var experience= results.Experience;
var status= results.Status;
var name= results.Name;
var uuid= results.Uuid;
var dynamic_property= results.AnotherProperty;
  

另一种方式。如果您知道要解析的类的所有可能属性。您可以使用Newtonsoft.Json的JsonProperty属性并使用强类型的DeserializeObject。

public class MyModel
{
    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public int experience {get;set;}

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public bool status {get;set;}

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string name {get;set;}

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public string uuid {get;set;}

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public object property_1 {get;set;}

    [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
    public object property_2 {get;set;}

    ...
}
  

您可以提出请求:

var httpRequest = WebRequest.Create(string.Format("baseurl" + "/PostData?id={0}", id));
httpRequest.Method = "POST";
httpRequest.ContentType = "application/json";
httpRequest.ContentLength = data.Length;

try
{
    using (var streamWriter = new StreamWriter(httpRequest.GetRequestStream()))
    {
        if (!string.IsNullOrEmpty(data))
        {
            streamWriter.Write(data);
            streamWriter.Flush();
            streamWriter.Close();
        }
    }

    var response = httpRequest.GetResponse();
}
catch (Exception)
{}