首页 > 解决方案 > 使用 Jsonsoft 反序列化期间单行字符串失败

问题描述

我有以下代码行

public T PostData<T>(string url, object content) 
{
 var result = default(T);
 var response = string.Empty;

 // other lines of code setting up client in between .. ignoring them  for readability

 response = client.UploadString(new Uri(url, UriKind.Relative), contentString);
 result = JsonConvert.DeserializeObject<T>(response, settings);
}

结果行是代码失败的地方。以上帖子内容调用自

public string GetCustomer(CustomerReq request)
 {
   var url = string.Format(_apiUrl + "/GetCustomer");
   var result = _webApiRouter.Route<string>(url, Enums.HttpMethodType.Post, request);        
   return result;
   }

上面的代码是我们将类型作为字符串传递的地方。它适用于所有对象,直到我得到一个 as 字符串并且响应是一个单词 ex: "test"

Int、byte、double 似乎工作正常。所以现在我想要它如下。在 if 条件下处理此代码的最佳方法是什么

if (response = string i.e one word )
    result =(T)Convert.ChangeType(response, typeof(T));

标签: c#jsonjson.net

解决方案


DeserializeObject()可以处理纯字符串,只要它们被引用:

var test = JsonConvert.DeserializeObject<string>("\"test\"");

工作示例:https ://dotnetfiddle.net/35qWGB

如果您无法更改端点,您可以简单地创建第二个PostData()不执行任何反序列化的重载:

public string PostData(string url, object content) 
{
  // other lines of code setting up client in between .. ignoring them  for readability

  return client.UploadString(new Uri(url, UriKind.Relative), contentString);
}

你也可以做一些奇怪的事情,比如:

public T PostData<T>(string url, object content) 
{
  // other lines of code setting up client in between .. ignoring them  for readability

  var response = client.UploadString(new Uri(url, UriKind.Relative), contentString);
  return typeof(T) == typeof(string)
    ? (T)(object)response
    : JsonConvert.DeserializeObject<T>(response, settings);
}

推荐阅读