2011-12-03 43 views
8

Tôi có một thiết bị đầu cuối WCF rằng cũng giống như ví dụ:POST JSON từ điển mà không cần Key/Value chữ

[OperationContract] 
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, UriTemplate = "")] 
Stream DoWork(Dictionary<string, string> items); 

Để vượt qua bất cứ điều gì để dịch vụ của tôi, tôi phải cấu trúc JSON của tôi như ví dụ:

{"items":[{"Key":"random1","Value":"value1"}, {"Key":"random2","Value":"value2"}]} 

Những gì tôi thực sự muốn nó trông như thế này là:

{"items":{"random1":"value1","random2":"value2"}} 

có cách nào để thực hiện điều này?

+0

Kiểm tra Christie

+0

@NewBeeee - Nó không dẽ. Bạn muốn đặt [DataContractJsonSerializerSettings.UseSimpleDictionaryFormat] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.usesimpledictionaryformat.aspx) nhưng nó không bao giờ bị lộ ra, vì vậy bạn sẽ cần để thay thế toàn bộ bộ nối tiếp. Xem https://stackoverflow.com/questions/6792785 hoặc https://stackoverflow.com/questions/11003016. Có thể https://stackoverflow.com/questions/33554997 cũng sẽ được yêu cầu. – dbc

+0

@NewBeeee - Thực ra tôi nghĩ https://stackoverflow.com/questions/6792785/replace-wcf-default-json-serialization là bản sao. – dbc

Trả lời

4

Đây có phải là một tùy chọn để bạn thay đổi tham số DoWork thành một chuỗi, sau đó sử dụng trình gỡ lỗi Json trong phương pháp để chuyển đổi nó sang định dạng thích hợp không?

0

Tôi đã tìm kiếm giải pháp tương tự. Tôi quản lý để làm cho nó hoạt động bằng cách sử dụng 'JavaScriptSerializer'. Bạn phải đặt đầu ra chức năng thành 'Stream' chứ không phải 'String'.

Public Function hotel_availability(ByVal data1 As Stream) As Stream Implements IMyTestAPI.hotel_availability 
.... 
Dim serializer As New JavaScriptSerializer() 
Dim serializedResult = serializer.Serialize(a_response) 
Dim json = Encoding.UTF8.GetBytes(serializedResult) 
Dim a_result as New MemoryStream(json) 
WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8" 

return a_result 
-1

Bạn có thể có thành công tốt hơn khi sử dụng trình serializer Newton Newton.

Có sẵn tại đây http://www.newtonsoft.com/json miễn phí và cũng có sẵn dưới dạng gói NuGet.

Tôi thấy linh hoạt hơn nhiều so với công cụ tuần tự hóa JSON.

Ngoài ra, có vẻ như URITemplate của bạn trống. Tôi đã không sử dụng phong cách cơ thể bọc, nhưng với phong cách cơ thể trần bạn cần URITemplate được dân cư.

0

Bạn về cơ bản cần một Object SerializableDynamic, do đó phương pháp của bạn sẽ trông như thế này:

[OperationContract] 
[WebInvoke(...)] 
Stream DoWork(SerializableDynamicObject items); 

Bạn có thể thấy một hướng dẫn tốt về cách xây dựng các đối tượng SerializableDynamic từ điển ở đây: (xem Solution phần) . Hy vọng điều này sẽ giúp ...

Các vấn đề liên quan