2011-12-03 10 views
8

Mam końcowy WCF, który jest jak takie:POST JSON słownik bez klucz/wartość Tekst

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

w celu przekazania niczego do mojego usługi, muszę uporządkować moje JSON jak takie:

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

Co tak naprawdę ma to wyglądać to tak:

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

Czy istnieje jakiś sposób, aby osiągnąć ten cel?

+0

Sprawdź Christie

+0

@NewBeeee - To nie jest łatwe. Chcesz ustawić [DataContractJsonSerializerSettings.UseSimpleDictionaryFormat] (https://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.useimpled dictionaryformat.aspx), ale nigdy nie zostanie ujawniony, więc będziesz potrzebować aby zastąpić cały serializer. Zobacz https://stackoverflow.com/questions/6792785 lub https://stackoverflow.com/questions/11003016. Prawdopodobnie będzie również wymagane https://stackoverflow.com/questions/33554997. – dbc

+0

@NewBeeee - W rzeczywistości myślę, że https://stackoverflow.com/questions/6792785/replace-wcf-default-json-serialization jest duplikatem. – dbc

Odpowiedz

4

Czy można zmienić parametr DoWork na ciąg znaków, a następnie zastosować w metodzie deserializator Json, aby przekonwertować go na odpowiedni format?

0

Szukałem tego samego rozwiązania. Udało mi się sprawić, żeby działało, używając "JavaScriptSerializer". Musisz ustawić wyjście funkcji na 'Stream', a nie 'String'.

-1

Możesz odnieść większy sukces, korzystając z serializatora Newtonsoft JSON.

Jest on dostępny tutaj bezpłatnie pod adresem http://www.newtonsoft.com/json i jest również dostępny jako pakiet NuGet.

Okazało się, że jestem bardziej elastyczny niż seryjne serie JSON.

Wygląda na to, że Twoja tablica URITEMplate jest pusta. Nie użyłem zawiniętego stylu ciała, ale przy gołym stylu ciała potrzebny jest URITemplate do wypełnienia.

0

Zasadniczo potrzebujemy SerializableDynamic obiekt, tak że metoda będzie wyglądać następująco:

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

można zobaczyć dobry poradnik jak budować SerializableDynamic Object ze słownika tutaj: (patrz Solution rozdział) . Mam nadzieję, że to pomoże ...