无法将json字符串反序列化为类

时间:2020-04-22 19:09:05

标签: c# .net json

我在.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}

没有错误,只是反序列化后响应类似乎为空,但是如您所见,响应字符串具有一些值。

enter image description here

4 个答案:

答案 0 :(得分:3)

您已经引用了System.Text.Json(Microsoft),因此您可以这样做:

static T DeserializeEasyWay<T>(string input)
{
    return JsonSerializer.Deserialize<T>(input, 
        new JsonSerializerOptions{PropertyNameCaseInsensitive = true});
}

我测试了您的字符串。可以。

答案 1 :(得分:2)

DataContractJsonSerializer区分大小写,因此它认为属性valueValue是不同的。

要解决此问题,可以将类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...