简体   繁体   English

JSON DeserializeObject 返回 null

[英]JSON DeserializeObject returns null

I have a JSON response that is formatted like:我有一个 JSON 响应,其格式如下:

{
    "list": {
        "historySteps": [
            {
                "actualUserDisplayName": "John Doe",
                "actualUserID": "SiteOwner",
                "invokerType": "USER",
                "step": 10,
                "timestampFormatted": "09/23/2019 12:37:04 PM",
                "transitionName": "Work",
                "userDisplayName": "John Doe",
                "userID": "SiteOwner"
            },
            {
                "actualUserDisplayName": "John Doe",
                "actualUserID": "SiteOwner",
                "comments": "Zebra",
                "invokerType": "USER",
                "step": 9,
                "timestampFormatted": "09/23/2019 11:12:30 AM",
                "transitionName": "Return",
                "userDisplayName": "John Doe",
                "userID": "SiteOwner"
            },
            {
                "actualUserDisplayName": "John Doe",
                "actualUserID": "SiteOwner",
                "invokerType": "USER",
                "step": 1,
                "timestampFormatted": "09/23/2019 10:11:48 AM",
                "transitionName": "Initiate",
                "userDisplayName": "John Doe",
                "userID": "SiteOwner"
            }
        ]
    }
}

I have C# code as:我有 C# 代码为:

public historyList GetWorkFlowHistory(string workspaceId, string dmsId)
{
    try {
    var client = new RestClient(TenantUrl + $"/api/rest/v1/workspaces/{workspaceId}/items/{dmsId}/workflows/history");
    client.Proxy = Proxy;
    var request = new RestRequest(Method.GET);
    request.AddCookie("customer", CustomerToken);
    request.AddCookie("JSESSIONID", SessionId);
    request.AddHeader("cache-control", "no-cache");


    IRestResponse response = client.Execute(request);


    if (response.ErrorException != null)
        throw response.ErrorException;
    else if (response.StatusCode != HttpStatusCode.OK)
        throw new Exception(response.Content);

        var results = SimpleJson.SimpleJson.DeserializeObject<historyList>(response.Content);

        return results;

}
    catch (Exception ex)
    {
        Log.WriteLog("Exception in GetWorkFlowHistory() - " + ex.Message);
    }

    return null;

}

[XmlRoot(ElementName = "historySteps")]
public class HistorySteps
{
    [XmlElement(ElementName = "actualUserDisplayName")]
    public string ActualUserDisplayName { get; set; }
    [XmlElement(ElementName = "actualUserID")]
    public string ActualUserID { get; set; }
    [XmlElement(ElementName = "comments")]
    public string Comments { get; set; }
    [XmlElement(ElementName = "invokerType")]
    public string InvokerType { get; set; }
    [XmlElement(ElementName = "step")]
    public string Step { get; set; }
    [XmlElement(ElementName = "timestampFormatted")]
    public string TimestampFormatted { get; set; }
    [XmlElement(ElementName = "transitionName")]
    public string TransitionName { get; set; }
    [XmlElement(ElementName = "userDisplayName")]
    public string UserDisplayName { get; set; }
    [XmlElement(ElementName = "userID")]
    public string UserID { get; set; }
}

[XmlRoot(ElementName = "list")]
public class historyList
{
    [XmlElement(ElementName = "historySteps")]
    public HistorySteps HistorySteps { get; set; }

}

The code works up to the point of response.Content where it retrieves the content.代码一直运行到 response.Content 检索内容的位置。 I can not figure out what I'm doin wrong when I'm attempting to DeserializeObject.当我尝试反序列化对象时,我无法弄清楚我做错了什么。 It returns historySteps = null.它返回 historySteps = null。 What am I missing?我错过了什么? Am I taking the right approach?我是否采取了正确的方法?

The property public HistorySteps HistorySteps { get; set; }属性public HistorySteps HistorySteps { get; set; } public HistorySteps HistorySteps { get; set; } public HistorySteps HistorySteps { get; set; } is not a list change to public List<HistorySteps> HistorySteps { get; set; } public HistorySteps HistorySteps { get; set; }不是对public List<HistorySteps> HistorySteps { get; set; }的列表更改public List<HistorySteps> HistorySteps { get; set; } public List<HistorySteps> HistorySteps { get; set; } . public List<HistorySteps> HistorySteps { get; set; }

Because SimpleJson is very... simple, you have to name your propertys exactly as the json and you will need a wrapper class for the "list" json.因为 SimpleJson 非常...简单,您必须将您的属性完全命名为 json,并且您将需要一个包装器 class 用于"list" json。

public class HistorySteps
{
    public string actualUserDisplayName { get; set; }
    public string actualUserID { get; set; }
    public string comments { get; set; }
    public string invokerType { get; set; }
    public string step { get; set; }
    public string timestampFormatted { get; set; }
    public string transitionName { get; set; }
    public string userDisplayName { get; set; }
    public string userID { get; set; }
}

public class historyList
{
    public List<HistorySteps> historySteps { get; set; }
}

public class MyResponse
{
    public historyList list { get; set; }
}

First of all, you are dealing with json, not xml.首先,您处理的是 json,而不是 xml。 You should annotate your properties either with DataContract/DataMember or with JsonProperty.您应该使用 DataContract/DataMember 或 JsonProperty 注释您的属性。

Second, you are almost there, you just need an extra class that wraps the whole thing.其次,你快到了,你只需要一个额外的 class 来包裹整个东西。 "list" is a property inside the root object “list”是根 object的一个属性

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM