2011-12-03 17 views
8

Tengo un punto final WCF que es como tal:POSTAL Diccionario JSON sin clave/valor Texto

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

Para pasar nada a mi servicio, me tiene que estructurar mi JSON como tales:

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

lo que realmente quiero que se vea como es la siguiente:

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

¿hay alguna manera de lograr esto?

+0

Compruebe Christie

+0

@NewBeeee - No es fácil. Desea establecer [DataContractJsonSerializerSettings.UseSimpleDictionaryFormat] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.usesimpledictionaryformat.aspx) pero nunca se expone, por lo que necesitará para reemplazar todo el serializador. Consulte https://stackoverflow.com/questions/6792785 o https://stackoverflow.com/questions/11003016. Posiblemente https://stackoverflow.com/questions/33554997 será requerido también. – dbc

+0

@NewBeeee - De hecho, creo que https://stackoverflow.com/questions/6792785/replace-wcf-default-json-serialization es un duplicado. – dbc

Respuesta

4

¿Es una opción para usted cambiar el parámetro DoWork a una cadena, luego usar un deserializador Json en el método para convertirlo al formato apropiado?

0

He estado buscando la misma solución. Me las arreglé para hacerlo funcionar usando 'JavaScriptSerializer'. Debe configurar la salida de la función en 'Stream', no '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

Puede tener un mayor éxito utilizando el serializador Newtonsoft JSON.

Está disponible aquí http://www.newtonsoft.com/json de forma gratuita y también está disponible como paquete NuGet.

He encontrado ser mucho más flexible que los serializadores JSON de valores.

Además, parece que su URITemplate está vacío. No he usado el estilo de cuerpo envuelto, pero con el estilo de cuerpo desnudo necesitas que URITemplate se rellene.

0

que básicamente necesita un objeto SerializableDynamic, por lo que su método se verá así:

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

Usted puede ver una buena guía sobre cómo construir el objeto SerializableDynamic de un diccionario aquí: (ver Solution sección) . Espero que esto ayude ...