Czy istnieje prosty sposób za pomocą JSON w .NET, aby upewnić się, że klucze są wysyłane małymi literami?
W tej chwili używam biblioteki Json.NET firmy Newtonsoft i po prostu używam
string loginRequest = JsonConvert.SerializeObject(auth);
W tym przypadku auth
jest to tylko następujący obiekt
public class Authority
{
public string Username { get; set; }
public string ApiToken { get; set; }
}
To skutkuje
{"Username":"Mark","ApiToken":"xyzABC1234"}
Czy istnieje sposób, aby upewnić się, że klawisze username
i apitoken
są zapisywane małymi literami?
Oczywiście nie chcę tego po prostu przeglądać, String.ToLower()
ponieważ wartości dla username
i apitoken
są mieszane.
Zdaję sobie sprawę, że mogę to zrobić programowo i ręcznie utworzyć ciąg JSON, ale potrzebuję tego na około 20 ciągów danych JSON i widzę, czy mogę zaoszczędzić trochę czasu. Zastanawiam się, czy istnieją już zbudowane biblioteki, które pozwalają wymusić małe litery przy tworzeniu kluczy.
Odpowiedzi:
Możesz w tym celu utworzyć niestandardowy mechanizm rozpoznawania umów. Następujący program do rozpoznawania kontraktu konwertuje wszystkie klucze na małe litery:
Stosowanie:
Wynik Wil w:
Jeśli zawsze chcesz serializować przy użyciu rozszerzenia
LowercaseContractResolver
, rozważ umieszczenie go w klasie, aby uniknąć powtarzania się:Które można wykorzystać w ten sposób:
ASP.NET MVC4 / WebAPI
Jeśli używasz ASP.NET MVC4 / WebAPI, możesz użyć
CamelCasePropertyNamesContractResolver
biblioteki from Newtonsoft.Json, która jest dołączona domyślnie.źródło
CamelCasePropertyNamesContractResolver
. Teraz stwierdziłem, żeSystem.Net.Http.Formatting.JsonContractResolver
jest to opcja domyślna w WebAPI, a ta klasa jest wewnętrzna. Skończyło się na przepisaniuJsonContractResolver
w przypadku wielbłąda. Ktoś zgłosił, że jest to publiczne aspnetwebstack.codeplex.com/workitem/228CamelCasePropertyNamesContratResolver
nie przekształcaj właściwości małymi literami, tylko pierwszy znak.źródło
W Json.NET 9.0.1 i nowszych wersjach można upewnić się, że wszystkie nazwy właściwości są konwertowane na małe litery przy użyciu niestandardowego
NamingStrategy
. Ta klasa wyodrębnia logikę algorytmicznego ponownego mapowania nazw właściwości z mechanizmu rozpoznawania kontraktu do oddzielnego, lekkiego obiektu, który można ustawićDefaultContractResolver.NamingStrategy
. W ten sposób unika się potrzeby tworzenia niestandardowego,ContractResolver
a tym samym może być łatwiejsze do zintegrowania z platformami, które mają już własne programy do rozpoznawania kontraktów.Zdefiniuj
LowercaseNamingStrategy
w następujący sposób:Następnie serializuj w następujący sposób:
Uwagi -
Użycie
string.ToLowerInvariant()
zapewnia, że ten sam kontrakt jest generowany we wszystkich lokalizacjach.Aby określić, czy nazwy właściwości przesłonięte, klucze słownika i rozszerzenie nazwy danych są małe litery, można ustawić
NamingStrategy.OverrideSpecifiedNames
,NamingStrategy.ProcessDictionaryKeys
lubNamingStrategy.ProcessExtensionDataNames
(Json.NET 10.0.1 i nowsze) dotrue
.Aby uzyskać najlepszą wydajność, możesz buforować program rozpoznawania umów .
Jeśli nie masz dostępu do ustawień serializatora w swoim frameworku, możesz zastosować
NamingStrategy
bezpośrednio do swojego obiektu w następujący sposób:Nie modyfikuj
NamingStrategy
zCamelCasePropertyNamesContractResolver
. Ten program rozpoznawania kontraktu udostępnia globalnie informacje o typie we wszystkich swoich wystąpieniach, więc modyfikowanie dowolnego wystąpienia może mieć nieoczekiwane skutki uboczne.źródło
możesz użyć „JsonProperty”:
Stosowanie:
źródło
Dla mnie użyłem kombinacji niektórych innych odpowiedzi i skończyło się na tym
był bliżej rozwiązania tego, czego szukałem, ponieważ nie chciałem tworzyć własnego
źródło