我正在使用.NET的HttpClient向WebAPI发出请求,该WebAPI返回一些需要在客户端进行一些自定义反序列化的JSON数据.为此,我已经制作了自己的JsonConverter,但我无法弄清楚如何让ReadAsAsync<T>方法获得转换器的存在.
我现在通过使用ReadAsStringAsync读取响应,然后将该字符串传递给我来解决我的问题JsonConvert.DeserializeObject,但似乎应该有一个更优雅的解决方案.
这是我的代码:
public PrefsResponse GetAllPrefs(string sid) {
HttpClient client = CreateHttpClient(null, sid);
var response = client.GetAsync("api/sites/" + sid).Result;
// TODO : find a way to hook custom converters to this...
// return response.Content.ReadAsAsync<PrefsResponse>().Result;
var stringResult = response.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject<PrefsResponse>(stringResult, new PrefClassJsonConverter());
}
Run Code Online (Sandbox Code Playgroud)
这是我能做的最好的,还是有更优雅的方式?
这里也是我创建HttpClient的地方,如果那是我需要连接它的地方:
private HttpClient CreateHttpClient(CommandContext ctx, string sid) {
var cookies = new CookieContainer();
var handler = new HttpClientHandler {
CookieContainer = cookies,
UseCookies = true,
UseDefaultCredentials = false …Run Code Online (Sandbox Code Playgroud) 我正在尝试序列化/反序列化Dictionary<string, object>C#。对象可以是任何可序列化的对象。
Json.NET几乎可以工作,但是如果字典中的值是an enum,则反序列化是不正确的,因为它反序列化为a long。TypeNameHandling.All没有任何区别。
序列化库是否有其他快速解决方案。结果不必是JSON,而必须是文本。
我对传递到字典的数据也没有影响。我只需要对遇到的任何问题进行序列化和反序列化。
编辑:StringEnumConverter没有帮助。数据被转换回Dictionary<string, object>,因此解串器不知道序列化的值是enum。它像对待对象一样对待它,反序列化后StringEnumConverter它仍然是一个对象string。如果long没有转换器,它将反序列化。JSON.NET不会保留枚举。
我要提供的解决方案是现有接口的实现,该接口被注入到我无法更改的现有解决方案中。
EDIT2:这是我正在尝试做的一个例子
public enum Foo { A, B, C }
public enum Bar { A, B, C }
public class Misc { public Foo Foo { get; set; } }
var dict = new Dictionary<string, object>();
dict.Add("a", Foo.A);
dict.Add("b", Bar.B);
dict.Add("c", new Misc());
// serialize dict to a string s
// deserialize s …Run Code Online (Sandbox Code Playgroud)