我有一个.net的类库项目。我不能使用第三方程序集,只允许使用微软程序集。
我有一个来自Web API的返回类,如下图所示。我试着将字符串序列化到这个类中,但它不工作,但它对其他类有效。我认为问题出在'T'类的接受上。
我的类。
public class ApiResponse<T>
{
public T Value { get; set; }
public bool HasError { get; set; }
public string ErrorMessage { get; set; }
public string DetailedErrorMessage { get; set; }
public string ErrorCode { get; set; }
public ApiResponse(string errorCode, string errorMessage, string detailedErrorMessage = "")
{
this.ErrorMessage = errorMessage;
this.ErrorCode = errorCode;
this.HasError = true;
this.DetailedErrorMessage = detailedErrorMessage;
}
public ApiResponse(T value)
{
this.Value = value;
this.HasError = false;
ErrorMessage = string.Empty;
}
public ApiResponse()
{
this.HasError = false;
ErrorMessage = string.Empty;
}
public ApiResponse(OLException e)
{
ErrorCode = e.ErrorCode;
ErrorMessage = e.Message;
HasError = true;
DetailedErrorMessage = e.StackTrace;
}
public ApiResponse(Exception e)
{
ErrorMessage = e.Message;
HasError = true;
DetailedErrorMessage = e.StackTrace;
}
}
这是我的Deserialize函数
private T JsonDeserialize<T>(string jsonString)
{
DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
T obj = (T)ser.ReadObject(ms);
return obj;
}
这里是我如何使用下面的方法。
ApiResponse<bool> response = JsonDeserialize<ApiResponse<bool>>(responseString);
响应字符串-->
{"value":false, "hasError":true, "errorMessage": "user1 client already exists.", "detailedErrorMessage":"", "errorCode":null}。
没有错误,只是在反序列化后响应类似乎为空,但如你所见,响应字符串有一些值。
你已经引用了 System.Text.Json
(微软),所以你可以直接这样做。
static T DeserializeEasyWay<T>(string input)
{
return JsonSerializer.Deserialize<T>(input,
new JsonSerializerOptions{PropertyNameCaseInsensitive = true});
}
我用你的字符串测试了一下 它的工作原理。
该 DataContractJsonSerializer
是大小写敏感的,那么它考虑的属性是 value
和 Value
是不同的。
为了解决这个问题,你可以把类的 ApiResponse
到。
[DataContract]
public class ApiResponse<T>
{
[DataMember(Name = "value")]
public T Value { get; set; }
[DataMember(Name = "hasError")]
public bool HasError { get; set; }
[DataMember(Name = "errorMessage")]
public string ErrorMessage { get; set; }
[DataMember(Name = "detailedErrorMessage")]
public string DetailedErrorMessage { get; set; }
[DataMember(Name = "errorCode")]
public string ErrorCode { get; set; }
// add other method ...
}
我希望这能帮助你解决这个问题。
如果你的目标是.NET Core 3.x,你可以使用 System.Text.Json
具有不区分大小写的属性名称的API
var properties = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };
var response = JsonSerializer.Deserialize<ApiResponse<bool>>(jsonString, properties);
也可以通过Nuget for .NET Core 2.x或.NET Framework 4.7.2或4.8获得。
对于旧的.NET Framework,你可以使用内置的......NET Core 2.x或.NET Framework 4.7.2或4.8。JavaScriptSerializer
var response = new JavaScriptSerializer().Deserialize<ApiResponse<bool>>(jsonString);
在这种情况下,你需要添加 System.Web.Extensions.dll
项目参考资料和 System.Web.Script.Serialization
到使用指令
你似乎缺少了DataContractJsonSerializer的注解。
[DataContract]
public class ApiResponse<T>
{
[DataMember]
public T Value { get; set; }
[DataMember]
public bool HasError { get; set; }
[DataMember]
public string ErrorMessage { get; set; }
[DataMember]
public string DetailedErrorMessage { get; set; }
[DataMember]
public string ErrorCode { get; set; }
.... etc...