簡體   English   中英

序列化JSON字符串以匹配WCF服務功能參數

[英]Serializing JSON string to Match WCF Service Function Parameter

我正面臨着在JSON中序列化對象以匹配WCF函數調用的參數名稱的問題。 問題是映射參數名稱,即傳入的JSON字符串應該具有與函數中傳遞的參數相同的起始值,例如

"{\"GetComplexDataResult\":{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}}"

這是我在我的客戶端調用的WCF函數,你可以看到參數名稱與返回的參數名稱相同“GetComplexDataResult”

[OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
String SaveData(CompositeType GetComplexDataResult);

出現的問題是當我嘗試使用Microsoft System.Web.Script.Serialization.JavaScriptSerializer或任何其他庫(例如Json.NET)序列化我的對象時

它只返回我{\\"BoolValue\\":true,\\"StringValue\\":\\"Hello World!\\"}即使我傳遞了同一類“CompositeType”的對象(這是客戶端代碼),例如

CompositeType GetComplexDataResult= new CompositeType();
GetComplexDataResult.BoolValue = true;
GetComplexDataResult.StringValue = "Hello World";

JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(patchVersion);

我的問題是我如何獲得這個JSON字符串

"{\"GetComplexDataResult\":{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}}"

代替

{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}

只需將我的對象傳遞給JSON解析器即可。 我可以在生成JSON字符串后手動連接它,但這會耗費大量時間。 有沒有解決這個問題的解析器。

如果使用參數名稱作為屬性名序序列化匿名對象,則會將其包含在json字符串中。 試試這個:

string json = serializer.Serialize(new { GetComplexDataResult = patchVersion});

此外,如果您不關心參數名稱是否包含在JSON中,您可以將BodyStyle設置為BodyStyle = WebMessageBodyStyle.Bare

我的問題是,是否有一個重要原因需要在json數據的開頭有\\"GetComplexDataResult\\"

我不相信json序列化程序會根據你的需要進行本地化,你幾乎必須自己處理它。

我們在我工作的公司所做的是,我們構建自己的響應包裝器,使我們所有的響應與所有json服務的格式相同。 因此,我們制作了一個標准的數據提取,它為outter包裝器的一個屬性返回一個datacontract。 你可以做類似的事情來獲得你正在尋找的“嵌套”功能。

這是一個例子:

[DataContract]
    public class ServiceResult<T>
    {
        [DataMember]
        public T GetComplexDataResult{ get; set; }
    }

更新 :修改為通用。 我想用我原來的答案進一步解釋我的目標。 再一次,adrift的答案更簡潔,請記住,如果你想擴展,比如添加消息,你必須做這樣的事情,或者自己動手做。 我真的很喜歡這種方法,因為無論我調用哪種WCF服務,我都知道我的格式總是一樣的。

對於我見過的每個JSON解析器 - 對象類型永遠不會包含在JSON中。 序列化表示該對象的實例。 如果您需要知道對象源類型引用,最好添加一個type屬性。 {\\"BoolValue\\":true,\\"StringValue\\":\\"Hello World!\\",\\"type\\":\\"GetComplexDataResult\\"}

你的輸出讓我想起了一個SOAP信封。 您不需要封裝 - 它只是使它更復雜。 JSON很簡單 - 保持簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM