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

问题描述 投票:0回答:1

我有一个.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}。

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

enter image description here

c# .net json
1个回答
3
投票

你已经引用了 System.Text.Json (微软),所以你可以直接这样做。

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

我用你的字符串测试了一下 它的工作原理。


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

我希望这能帮助你解决这个问题。


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,你可以使用内置的......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 到使用指令


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...
© www.soinside.com 2019 - 2024. All rights reserved.