我在.net中有一个类库项目。我不能使用第三方程序集,而只能使用Microsoft程序集。
我有一个来自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;
}
}
这是我的反序列化功能。
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客户端已经 存在。“,” detailedErrorMessage“:”“,” errorCode“:null}
没有错误,只是反序列化后响应类似乎为空,但是如您所见,响应字符串具有一些值。
答案 0 :(得分:3)
您已经引用了System.Text.Json
(Microsoft),因此您可以这样做:
static T DeserializeEasyWay<T>(string input)
{
return JsonSerializer.Deserialize<T>(input,
new JsonSerializerOptions{PropertyNameCaseInsensitive = true});
}
我测试了您的字符串。可以。
答案 1 :(得分:2)
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 ...
}
我希望这可以帮助您解决问题。
答案 2 :(得分:1)
如果您要定位.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,您可以使用内置的JavaScriptSerializer
var response = new JavaScriptSerializer().Deserialize<ApiResponse<bool>>(jsonString);
在这种情况下,您需要将System.Web.Extensions.dll
添加到项目引用中,并将System.Web.Script.Serialization
添加到using指令中
答案 3 :(得分:0)
您似乎缺少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...