How to deserialize JSON data from Jira? - c#
In Visual Studio I am able to make a connection to Jira witch returns the string (shortened to one instance for the example)
"expand": "operations,versionedRepresentations,editmeta,changelog,renderedFields",
"id": "15237",
"self": "https://companyName.atlassian.net/rest/agile/1.0/issue/15237",
"key": "THU-219",
"fields": {
"customfield_10110": null,
"fixVersions": [],
"customfield_10111": null,
"customfield_10112": null,
"resolution": null,
"customfield_10113": [
"com.atlassian.greenhopper.service.sprint.Sprint#a34aea2[id=53,rapidViewId=9,state=CLOSED,name=THU Sprint 7,goal=Survive!,startDate=2018-03-07T22:33:01.297Z,endDate=2018-03-21T22:33:00.000Z,completeDate=2018-03-20T19:16:10.159Z,sequence=53]",
"com.atlassian.greenhopper.service.sprint.Sprint#28b8057[id=58,rapidViewId=9,state=ACTIVE,name=THU Sprint 8,goal=make sure fixes fix ticket,startDate=2018-03-20T19:16:10.291Z,endDate=2018-04-03T19:16:00.000Z,completeDate=<null>,sequence=58]",
"com.atlassian.greenhopper.service.sprint.Sprint#3e1efb35[id=43,rapidViewId=9,state=CLOSED,name=THU Sprint 5,goal=,startDate=2018-02-06T20:44:37.751Z,endDate=2018-02-20T20:44:00.000Z,completeDate=2018-02-20T20:15:10.688Z,sequence=43]",
"com.atlassian.greenhopper.service.sprint.Sprint#2ce8e5a0[id=48,rapidViewId=9,state=CLOSED,name=THU Sprint 6,goal=,startDate=2018-02-20T20:15:01.461Z,endDate=2018-03-06T20:15:00.000Z,completeDate=2018-03-07T22:32:22.792Z,sequence=48]"
],
"customfield_10114": "1|hzz39z:",
"customfield_10500": null,
"customfield_10104": null,
"customfield_10105": null,
"customfield_10501": null,
"customfield_10106": null,
"customfield_10502": null,
"customfield_10503": null,
"customfield_10107": null,
"customfield_10108": null,
"customfield_10109": null,
"lastViewed": null,
"epic": {
"id": 15229,
"key": "THU-211",
"self": "https://companyName.atlassian.net/rest/agile/1.0/epic/15229",
"name": "project Name",
"summary": "Epic encompassing all TBD-related issues",
"color": {
"key": "color_2"
},
"done": false
},
"priority": {
"self": "https://nebook.atlassian.net/rest/api/2/priority/1",
"iconUrl": "https://companyName.atlassian.net/images/icons/priorities/highest.svg",
"name": "Highest",
"id": "1"
},
"customfield_10100": "2018-01-23T17:12:27.999-0600",
"customfield_10101": null,
"customfield_10102": null,
"labels": [
"user's first name"
],
"customfield_10103": null,
"customfield_10731": null,
"customfield_10610": null,
"customfield_10611": null,
"customfield_10733": null,
"customfield_10612": null,
"customfield_10613": null,
"timeestimate": null,
"customfield_10614": null,
"aggregatetimeoriginalestimate": null,
"customfield_10735": null,
"customfield_10615": null,
"versions": [],
"customfield_10616": null,
"customfield_10617": null,
"issuelinks": [
{
"id": "14337",
"self": "https://companyName.atlassian.net/rest/api/2/issueLink/14337",
"type": {
"id": "10000",
"name": "Blocks",
"inward": "is blocked by",
"outward": "blocks",
"self": "https://companyName.atlassian.net/rest/api/2/issueLinkType/10000"
},
"inwardIssue": {
"id": "18233",
"key": "THU-289",
"self": "https://companyName.atlassian.net/rest/api/2/issue/18233",
"fields": {
"summary": "summary",
"status": {
"self": "https://companyName.atlassian.net/rest/api/2/status/10804",
"description": "",
"iconUrl": "https://companyName.atlassian.net/images/icons/statuses/generic.png",
"name": "Code Review",
"id": "10804",
"statusCategory": {
"self": "https://companyName.atlassian.net/rest/api/2/statuscategory/4",
"id": 4,
"key": "indeterminate",
"colorName": "yellow",
"name": "In Progress"
}
},
"priority": {
"self": "https://companyName.atlassian.net/rest/api/2/priority/1",
"iconUrl": "https://companyName.atlassian.net/images/icons/priorities/highest.svg",
"name": "Highest",
"id": "1"
},
"issuetype": {
"self": "https://companyName.atlassian.net/rest/api/2/issuetype/10300",
"id": "10300",
"description": "Created by Jira Agile - do not edit or delete. Issue type for a user story.",
"iconUrl": "https://companyName.atlassian.net/images/icons/issuetypes/story.svg",
"name": "Story",
"subtask": false
}
}
}
},
{
"id": "14336",
"self": "https://companyName.atlassian.net/rest/api/2/issueLink/14336",
"type": {
"id": "10001",
"name": "Cloners",
"inward": "is cloned by",
"outward": "clones",
"self": "https://companyName.atlassian.net/rest/api/2/issueLinkType/10001"
},
"inwardIssue": {
"id": "18233",
"key": "THU-289",
"self": "https://companyName.atlassian.net/rest/api/2/issue/18233",
"fields": {
"summary": "summary",
"status": {
"self": "https://companyName.atlassian.net/rest/api/2/status/10804",
"description": "",
"iconUrl": "https://companyName.atlassian.net/images/icons/statuses/generic.png",
"name": "Code Review",
"id": "10804",
"statusCategory": {
"self": "https://companyName.atlassian.net/rest/api/2/statuscategory/4",
"id": 4,
"key": "indeterminate",
"colorName": "yellow",
"name": "In Progress"
}
},
"priority": {
"self": "https://companyName.atlassian.net/rest/api/2/priority/1",
"iconUrl": "https://companyName.atlassian.net/images/icons/priorities/highest.svg",
"name": "Highest",
"id": "1"
},
"issuetype": {
"self": "https://companyName.atlassian.net/rest/api/2/issuetype/10300",
"id": "10300",
"description": "Created by Jira Agile - do not edit or delete. Issue type for a user story.",
"iconUrl": "https://companyName.atlassian.net/images/icons/issuetypes/story.svg",
"name": "Story",
"subtask": false
}
}
}
}
],
"assignee": null,
"status": {
"self": "https://companyName.atlassian.net/rest/api/2/status/10804",
"description": "",
"iconUrl": "https://companyName.atlassian.net/images/icons/statuses/generic.png",
"name": "Code Review",
"id": "10804",
"statusCategory": {
"self": "https://companyName.atlassian.net/rest/api/2/statuscategory/4",
"id": 4,
"key": "indeterminate",
"colorName": "yellow",
"name": "In Progress"
}
},
"components": [],
"customfield_10730": null,
"customfield_10600": null,
"customfield_10601": null,
"customfield_10602": null,
"aggregatetimeestimate": null,
"customfield_10603": null,
"customfield_10604": null,
"customfield_10605": null,
"customfield_10727": null,
"customfield_10606": null,
"customfield_10728": null,
"customfield_10607": null,
"customfield_10608": null,
"customfield_10729": null,
"customfield_10609": null,
"creator": {
"self": "https://companyName.atlassian.net/rest/api/2/user?username=name",
"name": "name",
"key": "key",
"accountId": "accountId",
"emailAddress": "email",
"avatarUrls": {
"48x48": "https://avatar-cdn.atlassian.com/40f53dffbd45ed6f545a40ec91d4843f?s=48&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2F40f53dffbd45ed6f545a40ec91d4843f%3Fd%3Dmm%26s%3D48%26noRedirect%3Dtrue",
"24x24": "https://avatar-cdn.atlassian.com/40f53dffbd45ed6f545a40ec91d4843f?s=24&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2F40f53dffbd45ed6f545a40ec91d4843f%3Fd%3Dmm%26s%3D24%26noRedirect%3Dtrue",
"16x16": "https://avatar-cdn.atlassian.com/40f53dffbd45ed6f545a40ec91d4843f?s=16&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2F40f53dffbd45ed6f545a40ec91d4843f%3Fd%3Dmm%26s%3D16%26noRedirect%3Dtrue",
"32x32": "https://avatar-cdn.atlassian.com/40f53dffbd45ed6f545a40ec91d4843f?s=32&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2F40f53dffbd45ed6f545a40ec91d4843f%3Fd%3Dmm%26s%3D32%26noRedirect%3Dtrue"
},
"displayName": "name",
"active": true,
"timeZone": "America/Chicago"
},
"subtasks": [],
"reporter": {
"self": "https://companyName.atlassian.net/rest/api/2/user?username=name",
"name": "name",
"key": "key",
"accountId": "557058:ecce9327-53cc-4787-bcd5-ecf16309600b",
"emailAddress": "email",
"avatarUrls": {
"48x48": "https://avatar-cdn.atlassian.com/40f53dffbd45ed6f545a40ec91d4843f?s=48&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2F40f53dffbd45ed6f545a40ec91d4843f%3Fd%3Dmm%26s%3D48%26noRedirect%3Dtrue",
"24x24": "https://avatar-cdn.atlassian.com/40f53dffbd45ed6f545a40ec91d4843f?s=24&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2F40f53dffbd45ed6f545a40ec91d4843f%3Fd%3Dmm%26s%3D24%26noRedirect%3Dtrue",
"16x16": "https://avatar-cdn.atlassian.com/40f53dffbd45ed6f545a40ec91d4843f?s=16&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2F40f53dffbd45ed6f545a40ec91d4843f%3Fd%3Dmm%26s%3D16%26noRedirect%3Dtrue",
"32x32": "https://avatar-cdn.atlassian.com/40f53dffbd45ed6f545a40ec91d4843f?s=32&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2F40f53dffbd45ed6f545a40ec91d4843f%3Fd%3Dmm%26s%3D32%26noRedirect%3Dtrue"
},
"displayName": "name",
"active": true,
"timeZone": "America/Chicago"
},
"aggregateprogress": {
"progress": 0,
"total": 0
},
"customfield_10711": null,
"customfield_10712": null,
"closedSprints": [
{
"id": 53,
"self": "https://companyName.atlassian.net/rest/agile/1.0/sprint/53",
"state": "closed",
"name": "THU Sprint 7",
"startDate": "2018-03-07T22:33:01.297Z",
"endDate": "2018-03-21T22:33:00.000Z",
"completeDate": "2018-03-20T19:16:10.159Z",
"originBoardId": 9,
"goal": "Survive!"
},
{
"id": 43,
"self": "https://companyName.atlassian.net/rest/agile/1.0/sprint/43",
"state": "closed",
"name": "THU Sprint 5",
"startDate": "2018-02-06T20:44:37.751Z",
"endDate": "2018-02-20T20:44:00.000Z",
"completeDate": "2018-02-20T20:15:10.688Z",
"originBoardId": 9,
"goal": ""
},
{
"id": 48,
"self": "https://companyName.atlassian.net/rest/agile/1.0/sprint/48",
"state": "closed",
"name": "THU Sprint 6",
"startDate": "2018-02-20T20:15:01.461Z",
"endDate": "2018-03-06T20:15:00.000Z",
"completeDate": "2018-03-07T22:32:22.792Z",
"originBoardId": 9,
"goal": ""
}
],
"progress": {
"progress": 0,
"total": 0
},
"votes": {
"self": "https://companyName.atlassian.net/rest/api/2/issue/THU-219/votes",
"votes": 0,
"hasVoted": false
},
"worklog": {
"startAt": 0,
"maxResults": 20,
"total": 0,
"worklogs": []
},
"issuetype": {
"self": "https://companyName.atlassian.net/rest/api/2/issuetype/10300",
"id": "10300",
"description": "Created by Jira Agile - do not edit or delete. Issue type for a user story.",
"iconUrl": "https://companyName.atlassian.net/images/icons/issuetypes/story.svg",
"name": "Story",
"subtask": false
},
"timespent": null,
"sprint": {
"id": 58,
"self": "https://companyName.atlassian.net/rest/agile/1.0/sprint/58",
"state": "active",
"name": "THU Sprint 8",
"startDate": "2018-03-20T19:16:10.291Z",
"endDate": "2018-04-03T19:16:00.000Z",
"originBoardId": 9,
"goal": "make sure fixes fix ticket"
},
"project": {
"self": "https://nebook.atlassian.net/rest/api/2/project/11510",
"id": "11510",
"key": "THU",
"name": "name",
"projectTypeKey": "software",
"avatarUrls": {
"48x48": "https://nebook.atlassian.net/secure/projectavatar?avatarId=10324",
"24x24": "https://nebook.atlassian.net/secure/projectavatar?size=small&avatarId=10324",
"16x16": "https://nebook.atlassian.net/secure/projectavatar?size=xsmall&avatarId=10324",
"32x32": "https://nebook.atlassian.net/secure/projectavatar?size=medium&avatarId=10324"
}
},
"aggregatetimespent": null,
"resolutiondate": null,
"workratio": -1,
"watches": {
"self": "https://companyName.atlassian.net/rest/api/2/issue/THU-219/watchers",
"watchCount": 2,
"isWatching": false
},
"created": "2017-12-14T18:01:28.505-0600",
"customfield_10300": null,
"customfield_10301": null,
"updated": "2018-03-20T14:16:13.195-0500",
"timeoriginalestimate": null,
"description": "description",
"timetracking": {},
"customfield_10401": [],
"customfield_10402": null,
"customfield_10006": "THU-211",
"customfield_10403": null,
"security": null,
"customfield_10007": null,
"attachment": [],
"flagged": false,
"summary": "summary",
"customfield_10000": "{}",
"customfield_10001": null,
"customfield_10002": null,
"customfield_10400": null,
"environment": null,
"duedate": null,
"comment": {
"comments": [
{
"self": "https://companyName.atlassian.net/rest/api/2/issue/15237/comment/23890",
"id": "23890",
"author": {
"self": "https://companyName.atlassian.net/rest/api/2/user?username=name",
"name": "name",
"key": "key",
"accountId": "accountId",
"emailAddress": "email",
"avatarUrls": {
"48x48": "https://avatar-cdn.atlassian.com/b232453b514d10d65f986fe7f2df592c?s=48&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fb232453b514d10d65f986fe7f2df592c%3Fd%3Dmm%26s%3D48%26noRedirect%3Dtrue",
"24x24": "https://avatar-cdn.atlassian.com/b232453b514d10d65f986fe7f2df592c?s=24&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fb232453b514d10d65f986fe7f2df592c%3Fd%3Dmm%26s%3D24%26noRedirect%3Dtrue",
"16x16": "https://avatar-cdn.atlassian.com/b232453b514d10d65f986fe7f2df592c?s=16&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fb232453b514d10d65f986fe7f2df592c%3Fd%3Dmm%26s%3D16%26noRedirect%3Dtrue",
"32x32": "https://avatar-cdn.atlassian.com/b232453b514d10d65f986fe7f2df592c?s=32&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fb232453b514d10d65f986fe7f2df592c%3Fd%3Dmm%26s%3D32%26noRedirect%3Dtrue"
},
"displayName": "name",
"active": true,
"timeZone": "America/Chicago"
},
"body": "text describing the issue",
"updateAuthor": {
"self": "https://companyName.atlassian.net/rest/api/2/user?username=name",
"name": "name",
"key": "key",
"accountId": "557058:d4a31d0e-7944-488b-9f89-fcfec87b95ac",
"emailAddress": "email",
"avatarUrls": {
"48x48": "https://avatar-cdn.atlassian.com/b232453b514d10d65f986fe7f2df592c?s=48&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fb232453b514d10d65f986fe7f2df592c%3Fd%3Dmm%26s%3D48%26noRedirect%3Dtrue",
"24x24": "https://avatar-cdn.atlassian.com/b232453b514d10d65f986fe7f2df592c?s=24&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fb232453b514d10d65f986fe7f2df592c%3Fd%3Dmm%26s%3D24%26noRedirect%3Dtrue",
"16x16": "https://avatar-cdn.atlassian.com/b232453b514d10d65f986fe7f2df592c?s=16&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fb232453b514d10d65f986fe7f2df592c%3Fd%3Dmm%26s%3D16%26noRedirect%3Dtrue",
"32x32": "https://avatar-cdn.atlassian.com/b232453b514d10d65f986fe7f2df592c?s=32&d=https%3A%2F%2Fsecure.gravatar.com%2Favatar%2Fb232453b514d10d65f986fe7f2df592c%3Fd%3Dmm%26s%3D32%26noRedirect%3Dtrue"
},
"displayName": "name",
"active": true,
"timeZone": "America/Chicago"
},
"created": "2018-01-23T17:12:27.999-0600",
"updated": "2018-01-23T17:12:27.999-0600"
}
],
"maxResults": 1,
"total": 1,
"startAt": 0
}
}
},
I have been able to find some examples on here that deal with this issue however I have not been able to find anything that deals with repeated key words like my JSON data has.
The only real information I care about is the initial "Key" value (In this example "THU-219") and the status "name" field which is under "fields" -> "issuelinks" -> "inwardIssue" -> "fields" -> "status" -> "name"
I would like to be able to print out in the form of
Key: THU-219 \n
Status: "Code Review"
To achieve this I have attempted this code (after I have made a secure connection)Where respStr is the entire string which contains the snippet above in the same format for each issue. Am I creating my classes wrong? Because I am unable to get the expected data. I am aware that there is an option in Visual studio to "paste as JSON classes" but I getting an error that won't allow me to utilize this feature so I need a way to accomplish this without relying on that paste special feature.
String respStr = response.Content;
JiraObject jira = JsonConvert.DeserializeObject<JiraObject>(respStr);
foreach (KeyValuePair<string, Key>kvp in jira.Issues)
{
Console.WriteLine("Key:" + kvp.Value.Keys);
Console.WriteLine("Status:" + kvp.Value.Status)
Console.WriteLine();
}
Console.ReadKey();
}
}
class JiraObject
{
[JsonProperty("issues")]
public Dictionary<string, issues> Issues { get; set; }
}
class issues
{
[JsonProperty("key")]
public Dictionary<string, Key> Keys { get; set; }
[JsonProperty("fields")]
public Dictionary<string, Fields> fields { get; set; }
}
class Key
{
public Key Keys { get; set; }
}
class Fields
{
[JsonProperty("issuelinks")]
public Dictionary<string, issuelinks> issueLinks { get; set; }
}
class issuelinks
{
[JsonProperty("inwardIssue")]
public Dictionary<string,inwardIssue> inwardIssues { get; set; }
}
class inwardIssue
{
[JsonProperty("fields")]
public Dictionary<string, inwardFields> inwardFields { get; set; }
}
class inwardFields
{
[JsonProperty("status")]
public Dictionary<string, status> status { get; set; }
}
class status
{
[JsonProperty("name")]
public Dictionary<string,name> name { get; set; }
}
class name
{
public name names { get; set; }
}
As pointed out by Kevin Avignon your JSON is not valid. It's missing a "{" at the beginning and you need to remove the "," at the end so that we can use it (but this were just a minor problem).
In order to get the classes you need you can just dump your JSON into json2csharp.com. In your case i got the following:
public class Color
{
public string key { get; set; }
}
public class Epic
{
public int id { get; set; }
public string key { get; set; }
public string self { get; set; }
public string name { get; set; }
public string summary { get; set; }
public Color color { get; set; }
public bool done { get; set; }
}
public class Priority
{
public string self { get; set; }
public string iconUrl { get; set; }
public string name { get; set; }
public string id { get; set; }
}
public class Type
{
public string id { get; set; }
public string name { get; set; }
public string inward { get; set; }
public string outward { get; set; }
public string self { get; set; }
}
public class StatusCategory
{
public string self { get; set; }
public int id { get; set; }
public string key { get; set; }
public string colorName { get; set; }
public string name { get; set; }
}
public class Status
{
public string self { get; set; }
public string description { get; set; }
public string iconUrl { get; set; }
public string name { get; set; }
public string id { get; set; }
public StatusCategory statusCategory { get; set; }
}
public class Priority2
{
public string self { get; set; }
public string iconUrl { get; set; }
public string name { get; set; }
public string id { get; set; }
}
public class Issuetype
{
public string self { get; set; }
public string id { get; set; }
public string description { get; set; }
public string iconUrl { get; set; }
public string name { get; set; }
public bool subtask { get; set; }
}
public class Fields2
{
public string summary { get; set; }
public Status status { get; set; }
public Priority2 priority { get; set; }
public Issuetype issuetype { get; set; }
}
public class InwardIssue
{
public string id { get; set; }
public string key { get; set; }
public string self { get; set; }
public Fields2 fields { get; set; }
}
public class Issuelink
{
public string id { get; set; }
public string self { get; set; }
public Type type { get; set; }
public InwardIssue inwardIssue { get; set; }
}
public class StatusCategory2
{
public string self { get; set; }
public int id { get; set; }
public string key { get; set; }
public string colorName { get; set; }
public string name { get; set; }
}
public class Status2
{
public string self { get; set; }
public string description { get; set; }
public string iconUrl { get; set; }
public string name { get; set; }
public string id { get; set; }
public StatusCategory2 statusCategory { get; set; }
}
public class AvatarUrls
{
public string __invalid_name__48x48 { get; set; }
public string __invalid_name__24x24 { get; set; }
public string __invalid_name__16x16 { get; set; }
public string __invalid_name__32x32 { get; set; }
}
public class Creator
{
public string self { get; set; }
public string name { get; set; }
public string key { get; set; }
public string accountId { get; set; }
public string emailAddress { get; set; }
public AvatarUrls avatarUrls { get; set; }
public string displayName { get; set; }
public bool active { get; set; }
public string timeZone { get; set; }
}
public class AvatarUrls2
{
public string __invalid_name__48x48 { get; set; }
public string __invalid_name__24x24 { get; set; }
public string __invalid_name__16x16 { get; set; }
public string __invalid_name__32x32 { get; set; }
}
public class Reporter
{
public string self { get; set; }
public string name { get; set; }
public string key { get; set; }
public string accountId { get; set; }
public string emailAddress { get; set; }
public AvatarUrls2 avatarUrls { get; set; }
public string displayName { get; set; }
public bool active { get; set; }
public string timeZone { get; set; }
}
public class Aggregateprogress
{
public int progress { get; set; }
public int total { get; set; }
}
public class ClosedSprint
{
public int id { get; set; }
public string self { get; set; }
public string state { get; set; }
public string name { get; set; }
public DateTime startDate { get; set; }
public DateTime endDate { get; set; }
public DateTime completeDate { get; set; }
public int originBoardId { get; set; }
public string goal { get; set; }
}
public class Progress
{
public int progress { get; set; }
public int total { get; set; }
}
public class Votes
{
public string self { get; set; }
public int votes { get; set; }
public bool hasVoted { get; set; }
}
public class Worklog
{
public int startAt { get; set; }
public int maxResults { get; set; }
public int total { get; set; }
public List<object> worklogs { get; set; }
}
public class Issuetype2
{
public string self { get; set; }
public string id { get; set; }
public string description { get; set; }
public string iconUrl { get; set; }
public string name { get; set; }
public bool subtask { get; set; }
}
public class Sprint
{
public int id { get; set; }
public string self { get; set; }
public string state { get; set; }
public string name { get; set; }
public DateTime startDate { get; set; }
public DateTime endDate { get; set; }
public int originBoardId { get; set; }
public string goal { get; set; }
}
public class AvatarUrls3
{
public string __invalid_name__48x48 { get; set; }
public string __invalid_name__24x24 { get; set; }
public string __invalid_name__16x16 { get; set; }
public string __invalid_name__32x32 { get; set; }
}
public class Project
{
public string self { get; set; }
public string id { get; set; }
public string key { get; set; }
public string name { get; set; }
public string projectTypeKey { get; set; }
public AvatarUrls3 avatarUrls { get; set; }
}
public class Watches
{
public string self { get; set; }
public int watchCount { get; set; }
public bool isWatching { get; set; }
}
public class Timetracking
{
}
public class AvatarUrls4
{
public string __invalid_name__48x48 { get; set; }
public string __invalid_name__24x24 { get; set; }
public string __invalid_name__16x16 { get; set; }
public string __invalid_name__32x32 { get; set; }
}
public class Author
{
public string self { get; set; }
public string name { get; set; }
public string key { get; set; }
public string accountId { get; set; }
public string emailAddress { get; set; }
public AvatarUrls4 avatarUrls { get; set; }
public string displayName { get; set; }
public bool active { get; set; }
public string timeZone { get; set; }
}
public class AvatarUrls5
{
public string __invalid_name__48x48 { get; set; }
public string __invalid_name__24x24 { get; set; }
public string __invalid_name__16x16 { get; set; }
public string __invalid_name__32x32 { get; set; }
}
public class UpdateAuthor
{
public string self { get; set; }
public string name { get; set; }
public string key { get; set; }
public string accountId { get; set; }
public string emailAddress { get; set; }
public AvatarUrls5 avatarUrls { get; set; }
public string displayName { get; set; }
public bool active { get; set; }
public string timeZone { get; set; }
}
public class Comment2
{
public string self { get; set; }
public string id { get; set; }
public Author author { get; set; }
public string body { get; set; }
public UpdateAuthor updateAuthor { get; set; }
public DateTime created { get; set; }
public DateTime updated { get; set; }
}
public class Comment
{
public List<Comment2> comments { get; set; }
public int maxResults { get; set; }
public int total { get; set; }
public int startAt { get; set; }
}
public class Fields
{
public object customfield_10110 { get; set; }
public List<object> fixVersions { get; set; }
public object customfield_10111 { get; set; }
public object customfield_10112 { get; set; }
public object resolution { get; set; }
public List<string> customfield_10113 { get; set; }
public string customfield_10114 { get; set; }
public object customfield_10500 { get; set; }
public object customfield_10104 { get; set; }
public object customfield_10105 { get; set; }
public object customfield_10501 { get; set; }
public object customfield_10106 { get; set; }
public object customfield_10502 { get; set; }
public object customfield_10503 { get; set; }
public object customfield_10107 { get; set; }
public object customfield_10108 { get; set; }
public object customfield_10109 { get; set; }
public object lastViewed { get; set; }
public Epic epic { get; set; }
public Priority priority { get; set; }
public DateTime customfield_10100 { get; set; }
public object customfield_10101 { get; set; }
public object customfield_10102 { get; set; }
public List<string> labels { get; set; }
public object customfield_10103 { get; set; }
public object customfield_10731 { get; set; }
public object customfield_10610 { get; set; }
public object customfield_10611 { get; set; }
public object customfield_10733 { get; set; }
public object customfield_10612 { get; set; }
public object customfield_10613 { get; set; }
public object timeestimate { get; set; }
public object customfield_10614 { get; set; }
public object aggregatetimeoriginalestimate { get; set; }
public object customfield_10735 { get; set; }
public object customfield_10615 { get; set; }
public List<object> versions { get; set; }
public object customfield_10616 { get; set; }
public object customfield_10617 { get; set; }
public List<Issuelink> issuelinks { get; set; }
public object assignee { get; set; }
public Status2 status { get; set; }
public List<object> components { get; set; }
public object customfield_10730 { get; set; }
public object customfield_10600 { get; set; }
public object customfield_10601 { get; set; }
public object customfield_10602 { get; set; }
public object aggregatetimeestimate { get; set; }
public object customfield_10603 { get; set; }
public object customfield_10604 { get; set; }
public object customfield_10605 { get; set; }
public object customfield_10727 { get; set; }
public object customfield_10606 { get; set; }
public object customfield_10728 { get; set; }
public object customfield_10607 { get; set; }
public object customfield_10608 { get; set; }
public object customfield_10729 { get; set; }
public object customfield_10609 { get; set; }
public Creator creator { get; set; }
public List<object> subtasks { get; set; }
public Reporter reporter { get; set; }
public Aggregateprogress aggregateprogress { get; set; }
public object customfield_10711 { get; set; }
public object customfield_10712 { get; set; }
public List<ClosedSprint> closedSprints { get; set; }
public Progress progress { get; set; }
public Votes votes { get; set; }
public Worklog worklog { get; set; }
public Issuetype2 issuetype { get; set; }
public object timespent { get; set; }
public Sprint sprint { get; set; }
public Project project { get; set; }
public object aggregatetimespent { get; set; }
public object resolutiondate { get; set; }
public int workratio { get; set; }
public Watches watches { get; set; }
public DateTime created { get; set; }
public object customfield_10300 { get; set; }
public object customfield_10301 { get; set; }
public DateTime updated { get; set; }
public object timeoriginalestimate { get; set; }
public string description { get; set; }
public Timetracking timetracking { get; set; }
public List<object> customfield_10401 { get; set; }
public object customfield_10402 { get; set; }
public string customfield_10006 { get; set; }
public object customfield_10403 { get; set; }
public object security { get; set; }
public object customfield_10007 { get; set; }
public List<object> attachment { get; set; }
public bool flagged { get; set; }
public string summary { get; set; }
public string customfield_10000 { get; set; }
public object customfield_10001 { get; set; }
public object customfield_10002 { get; set; }
public object customfield_10400 { get; set; }
public object environment { get; set; }
public object duedate { get; set; }
public Comment comment { get; set; }
}
public class RootObject
{
public string expand { get; set; }
public string id { get; set; }
public string self { get; set; }
public string key { get; set; }
public Fields fields { get; set; }
}
Now you only need to remove everything that you don't need (and maybe rename class names if you want). After doing so you will have your classes that you can work with.
The following classes will just store the initial "key" value and the "name" of the status as you asked for in your post.
public class Status
{
public string Name { get; set; }
}
public class Fields2
{
public Status Status { get; set; }
}
public class InwardIssue
{
public Fields2 Fields { get; set; }
}
public class Issuelink
{
public InwardIssue InwardIssue { get; set; }
}
public class Fields
{
public List<Issuelink> Issuelinks { get; set; }
}
public class RootObject
{
public string Key { get; set; }
public Fields Fields { get; set; }
}
To deserialize your json you can now use the following code:
string content = //your json
RootObject ro = Newtonsoft.Json.JsonConvert.DeserializeObject<RootObject>(content);
If something is still wrong then pls write so and i will try to figure something out.
Fabian,
Below are the generated classes from the website you provided after I put my entire JSON string into the website.
public class I18nErrorMessage
{
public string i18nKey { get; set; }
public List<object> parameters { get; set; }
}
public class Customfield10502
{
public string errorMessage { get; set; }
public I18nErrorMessage i18nErrorMessage { get; set; }
}
public class I18nErrorMessage2
{
public string i18nKey { get; set; }
public List<object> parameters { get; set; }
}
public class Customfield10503
{
public string errorMessage { get; set; }
public I18nErrorMessage2 i18nErrorMessage { get; set; }
}
public class Color
{
public string key { get; set; }
}
public class Epic
{
public int id { get; set; }
public string key { get; set; }
public string self { get; set; }
public string name { get; set; }
public string summary { get; set; }
public Color color { get; set; }
public bool done { get; set; }
}
public class Priority
{
public string self { get; set; }
public string iconUrl { get; set; }
public string name { get; set; }
public string id { get; set; }
}
public class I18nErrorMessage3
{
public string i18nKey { get; set; }
public List<object> parameters { get; set; }
}
public class Customfield10616
{
public string errorMessage { get; set; }
public I18nErrorMessage3 i18nErrorMessage { get; set; }
}
public class AvatarUrls
{
public string __invalid_name__48x48 { get; set; }
public string __invalid_name__24x24 { get; set; }
public string __invalid_name__16x16 { get; set; }
public string __invalid_name__32x32 { get; set; }
}
public class Assignee
{
public string self { get; set; }
public string name { get; set; }
public string key { get; set; }
public string accountId { get; set; }
public string emailAddress { get; set; }
public AvatarUrls avatarUrls { get; set; }
public string displayName { get; set; }
public bool active { get; set; }
public string timeZone { get; set; }
}
public class StatusCategory
{
public string self { get; set; }
public int id { get; set; }
public string key { get; set; }
public string colorName { get; set; }
public string name { get; set; }
}
public class Status
{
public string self { get; set; }
public string description { get; set; }
public string iconUrl { get; set; }
public string name { get; set; }
public string id { get; set; }
public StatusCategory statusCategory { get; set; }
}
public class AvatarUrls2
{
public string __invalid_name__48x48 { get; set; }
public string __invalid_name__24x24 { get; set; }
public string __invalid_name__16x16 { get; set; }
public string __invalid_name__32x32 { get; set; }
}
public class Creator
{
public string self { get; set; }
public string name { get; set; }
public string key { get; set; }
public string accountId { get; set; }
public string emailAddress { get; set; }
public AvatarUrls2 avatarUrls { get; set; }
public string displayName { get; set; }
public bool active { get; set; }
public string timeZone { get; set; }
}
public class AvatarUrls3
{
public string __invalid_name__48x48 { get; set; }
public string __invalid_name__24x24 { get; set; }
public string __invalid_name__16x16 { get; set; }
public string __invalid_name__32x32 { get; set; }
}
public class Reporter
{
public string self { get; set; }
public string name { get; set; }
public string key { get; set; }
public string accountId { get; set; }
public string emailAddress { get; set; }
public AvatarUrls3 avatarUrls { get; set; }
public string displayName { get; set; }
public bool active { get; set; }
public string timeZone { get; set; }
}
public class Aggregateprogress
{
public int progress { get; set; }
public int total { get; set; }
}
public class Customfield10711
{
public string self { get; set; }
public string value { get; set; }
public string id { get; set; }
}
public class AvatarUrls4
{
public string __invalid_name__48x48 { get; set; }
public string __invalid_name__24x24 { get; set; }
public string __invalid_name__16x16 { get; set; }
public string __invalid_name__32x32 { get; set; }
}
public class Customfield10712
{
public string self { get; set; }
public string name { get; set; }
public string key { get; set; }
public string accountId { get; set; }
public string emailAddress { get; set; }
public AvatarUrls4 avatarUrls { get; set; }
public string displayName { get; set; }
public bool active { get; set; }
public string timeZone { get; set; }
}
public class ClosedSprint
{
public int id { get; set; }
public string self { get; set; }
public string state { get; set; }
public string name { get; set; }
public DateTime startDate { get; set; }
public DateTime endDate { get; set; }
public DateTime completeDate { get; set; }
public int originBoardId { get; set; }
public string goal { get; set; }
}
public class Progress
{
public int progress { get; set; }
public int total { get; set; }
}
public class Votes
{
public string self { get; set; }
public int votes { get; set; }
public bool hasVoted { get; set; }
}
public class Worklog
{
public int startAt { get; set; }
public int maxResults { get; set; }
public int total { get; set; }
public List<object> worklogs { get; set; }
}
public class Issuetype
{
public string self { get; set; }
public string id { get; set; }
public string description { get; set; }
public string iconUrl { get; set; }
public string name { get; set; }
public bool subtask { get; set; }
public int avatarId { get; set; }
}
public class Sprint
{
public int id { get; set; }
public string self { get; set; }
public string state { get; set; }
public string name { get; set; }
public DateTime startDate { get; set; }
public DateTime endDate { get; set; }
public int originBoardId { get; set; }
public string goal { get; set; }
}
public class AvatarUrls5
{
public string __invalid_name__48x48 { get; set; }
public string __invalid_name__24x24 { get; set; }
public string __invalid_name__16x16 { get; set; }
public string __invalid_name__32x32 { get; set; }
}
public class Project
{
public string self { get; set; }
public string id { get; set; }
public string key { get; set; }
public string name { get; set; }
public string projectTypeKey { get; set; }
public AvatarUrls5 avatarUrls { get; set; }
}
public class Watches
{
public string self { get; set; }
public int watchCount { get; set; }
public bool isWatching { get; set; }
}
public class Timetracking
{
}
public class I18nErrorMessage4
{
public string i18nKey { get; set; }
public List<object> parameters { get; set; }
}
public class Customfield10400
{
public string errorMessage { get; set; }
public I18nErrorMessage4 i18nErrorMessage { get; set; }
}
public class Comment
{
public List<object> comments { get; set; }
public int maxResults { get; set; }
public int total { get; set; }
public int startAt { get; set; }
}
public class StatusCategory2
{
public string self { get; set; }
public int id { get; set; }
public string key { get; set; }
public string colorName { get; set; }
public string name { get; set; }
}
public class Status2
{
public string self { get; set; }
public string description { get; set; }
public string iconUrl { get; set; }
public string name { get; set; }
public string id { get; set; }
public StatusCategory2 statusCategory { get; set; }
}
public class Priority2
{
public string self { get; set; }
public string iconUrl { get; set; }
public string name { get; set; }
public string id { get; set; }
}
public class Issuetype2
{
public string self { get; set; }
public string id { get; set; }
public string description { get; set; }
public string iconUrl { get; set; }
public string name { get; set; }
public bool subtask { get; set; }
public int avatarId { get; set; }
}
public class Fields2
{
public string summary { get; set; }
public Status2 status { get; set; }
public Priority2 priority { get; set; }
public Issuetype2 issuetype { get; set; }
}
public class Parent
{
public string id { get; set; }
public string key { get; set; }
public string self { get; set; }
public Fields2 fields { get; set; }
}
public class Fields
{
public List<object> fixVersions { get; set; }
public object customfield_10110 { get; set; }
public object customfield_10111 { get; set; }
public object resolution { get; set; }
public object customfield_10112 { get; set; }
public List<string> customfield_10113 { get; set; }
public string customfield_10114 { get; set; }
public object customfield_10104 { get; set; }
public object customfield_10500 { get; set; }
public object customfield_10501 { get; set; }
public object customfield_10105 { get; set; }
public object customfield_10106 { get; set; }
public Customfield10502 customfield_10502 { get; set; }
public Customfield10503 customfield_10503 { get; set; }
public object customfield_10107 { get; set; }
public object customfield_10108 { get; set; }
public object customfield_10109 { get; set; }
public object lastViewed { get; set; }
public Epic epic { get; set; }
public Priority priority { get; set; }
public DateTime? customfield_10100 { get; set; }
public object customfield_10101 { get; set; }
public object customfield_10102 { get; set; }
public List<object> labels { get; set; }
public object customfield_10103 { get; set; }
public object customfield_10731 { get; set; }
public object customfield_10610 { get; set; }
public object customfield_10611 { get; set; }
public object customfield_10612 { get; set; }
public string customfield_10733 { get; set; }
public object customfield_10613 { get; set; }
public object timeestimate { get; set; }
public object customfield_10614 { get; set; }
public object aggregatetimeoriginalestimate { get; set; }
public DateTime? customfield_10735 { get; set; }
public List<object> versions { get; set; }
public object customfield_10615 { get; set; }
public Customfield10616 customfield_10616 { get; set; }
public object customfield_10617 { get; set; }
public List<object> issuelinks { get; set; }
public Assignee assignee { get; set; }
public Status status { get; set; }
public List<object> components { get; set; }
public object customfield_10730 { get; set; }
public object customfield_10600 { get; set; }
public object customfield_10601 { get; set; }
public object customfield_10602 { get; set; }
public object customfield_10603 { get; set; }
public object aggregatetimeestimate { get; set; }
public object customfield_10604 { get; set; }
public object customfield_10605 { get; set; }
public object customfield_10606 { get; set; }
public object customfield_10727 { get; set; }
public object customfield_10728 { get; set; }
public object customfield_10607 { get; set; }
public object customfield_10608 { get; set; }
public object customfield_10729 { get; set; }
public object customfield_10609 { get; set; }
public Creator creator { get; set; }
public List<object> subtasks { get; set; }
public Reporter reporter { get; set; }
public Aggregateprogress aggregateprogress { get; set; }
public Customfield10711 customfield_10711 { get; set; }
public Customfield10712 customfield_10712 { get; set; }
public List<ClosedSprint> closedSprints { get; set; }
public Progress progress { get; set; }
public Votes votes { get; set; }
public Worklog worklog { get; set; }
public Issuetype issuetype { get; set; }
public object timespent { get; set; }
public Sprint sprint { get; set; }
public Project project { get; set; }
public object aggregatetimespent { get; set; }
public object resolutiondate { get; set; }
public int workratio { get; set; }
public Watches watches { get; set; }
public DateTime created { get; set; }
public object customfield_10300 { get; set; }
public object customfield_10301 { get; set; }
public DateTime updated { get; set; }
public object timeoriginalestimate { get; set; }
public string description { get; set; }
public Timetracking timetracking { get; set; }
public List<object> customfield_10401 { get; set; }
public object customfield_10402 { get; set; }
public string customfield_10006 { get; set; }
public object customfield_10403 { get; set; }
public object security { get; set; }
public object customfield_10007 { get; set; }
public List<object> attachment { get; set; }
public bool flagged { get; set; }
public string summary { get; set; }
public string customfield_10000 { get; set; }
public object customfield_10001 { get; set; }
public object customfield_10002 { get; set; }
public Customfield10400 customfield_10400 { get; set; }
public object environment { get; set; }
public object duedate { get; set; }
public Comment comment { get; set; }
public string customfield_10710 { get; set; }
public Parent parent { get; set; }
}
public class Issue
{
public string expand { get; set; }
public string id { get; set; }
public string self { get; set; }
public string key { get; set; }
public Fields fields { get; set; }
}
public class RootObject
{
public string expand { get; set; }
public int startAt { get; set; }
public int maxResults { get; set; }
public int total { get; set; }
public List<Issue> issues { get; set; }
}
}
I figured I would rather have too many classes and get it to work then I can just weed out what I don't need after (might consider using other properties to generate other graphs, etc). Below is my code that I am trying. I have tried a few other variations but I still get that same unexpected character encountered error.
String respStr = response.Content;
RootObject ro = JsonConvert.DeserializeObject<RootObject>(respStr);
Console.WriteLine(ro.issues[0].key[0]);
Related
Problems Deserialising a nested object array
Here are my models: public class Order { public IEnumerable<LineItem> LineItems { get; set; } } public class LineItem { [JsonPropertyName("id")] public int Id { get; set; } [JsonPropertyName("name")] public string Name { get; set; } [JsonPropertyName("product_id")] public int ProductId { get; set; } [JsonPropertyName("variation_id")] public int VariationId { get; set; } [JsonPropertyName("quantity")] public int Quantity { get; set; } [JsonPropertyName("tax_class")] public string TaxClass { get; set; } [JsonPropertyName("subtotal")] public string Subtotal { get; set; } [JsonPropertyName("subtotal_tax")] public string SubtotalTax { get; set; } [JsonPropertyName("total")] public string Total { get; set; } [JsonPropertyName("total_tax")] public string TotalTax { get; set; } [JsonPropertyName("taxes")] public List<object> Taxes { get; set; } [JsonPropertyName("meta_data")] public List<MetaData> MetaData { get; set; } [JsonPropertyName("sku")] public string Sku { get; set; } [JsonPropertyName("price")] public double Price { get; set; } [JsonPropertyName("parent_name")] public string ParentName { get; set; } } As you can see the HttpRequest property contains an array of line items: [ { "id":7928, "parent_id":0, "status":"on-hold", "currency":"GBP", "version":"5.7.1", "prices_include_tax":true, "date_created":"2021-10-04T00:26:22", "date_modified":"2021-10-04T00:26:22", "discount_total":"0.00", "discount_tax":"0.00", "shipping_total":"0.00", "shipping_tax":"0.00", "cart_tax":"0.00", "total":"2.50", "total_tax":"0.00", "customer_id":3, "order_key":"redacted", "billing":{ "first_name":"redacted", "last_name":"redacted", "company":"", "address_1":"redacted", "address_2":"redacted", "city":"redacted", "state":"redacted", "postcode":"redacted", "country":"GB", "email":"redacted", "phone":"redacted" }, "shipping":{ "first_name":"redacted", "last_name":"redacted", "company":"", "address_1":"redacted", "address_2":"redacted Lane", "city":"redacted", "state":"redacted", "postcode":"redacted", "country":"GB", "phone":"" }, "payment_method":"bacs", "payment_method_title":"Direct bank transfer", "transaction_id":"", "customer_ip_address":"redacted", "customer_user_agent":"redacted", "created_via":"redacted", "customer_note":"", "date_completed":null, "date_paid":null, "cart_hash":"redacted", "number":"redacted", "meta_data":[ { "id":190011, "key":"redacted", "value":"no" }, { "id":190012, "key":"redacted", "value":"yes" }, { "id":190016, "key":"_new_order_email_sent", "value":"true" }, { "id":190017, "key":"_thankyou_action_done", "value":"1" } ], "line_items":[ { "id":5287, "name":"John Guest 3\/8 to 1\/4 Fitting PI0112f4S", "product_id":5699, "variation_id":0, "quantity":1, "tax_class":"", "subtotal":"2.50", "subtotal_tax":"0.00", "total":"2.50", "total_tax":"0.00", "taxes":[ ], "meta_data":[ { "id":48648, "key":"_WCPA_order_meta_data", "value":"", "display_key":"_WCPA_order_meta_data", "display_value":"" } ], "sku":"", "price":2.5, "parent_name":null } ], "tax_lines":[ ], "shipping_lines":[ { "id":5288, "method_title":"Collect from store", "method_id":"local_pickup", "instance_id":"13", "total":"0.00", "total_tax":"0.00", "taxes":[ ], "meta_data":[ { "id":48647, "key":"Items", "value":"John Guest 3\/8 to 1\/4 Fitting PI0112f4S × 1", "display_key":"Items", "display_value":"John Guest 3\/8 to 1\/4 Fitting PI0112f4S × 1" } ] } ], "fee_lines":[ ], "coupon_lines":[ ], "refunds":[ ], "date_created_gmt":"2021-10-03T23:26:22", "date_modified_gmt":"2021-10-03T23:26:22", "date_completed_gmt":null, "date_paid_gmt":null, "currency_symbol":"\u00a3", "_links":{ "self":[ { "href":"redacted" } ], "collection":[ { "href":"redacted" } ], "customer":[ { "href":"redacted" } ] } }, ] I am wondering why when this is deserialized using public class WooCommerceOrders { private HttpRequestService _httpRequestService; private string _url; public WooCommerceOrders() { _httpRequestService = new HttpRequestService(); _url = "https://kegthat.com/wp-json/wc/v3/orders"; } public List<Order> GetOrdersJson() { var result = _httpRequestService.CallApi(_url).Content.ReadAsStringAsync(); return _httpRequestService.DeserializeApiResponseJson<List<Order>>(result.Result); } } The json for line items returns "lineItems": null, however some fields such as shipping return "shipping": { "firstName": null, "lastName": null, "company": "", "address1": null, "address2": null, "city": "redacting city", "state": "Cheshire", "postcode": "redacting postcode", "country": "GB", "phone": "" }, This wont let me add too much more code than content This wont let me add too much more code than content This wont let me add too much more code than content This wont let me add too much more code than content This wont let me add too much more code than content This wont let me add too much more code than content This wont let me add too much more code than content This wont let me add too much more code than content This wont let me add too much more code than content Why can I not return line items?
Try this using Newtonsoft.Json using Newtonsoft.Json; ..... public List<Order> GetOrdersJson() { var result = _httpRequestService.CallApi(_url).Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject< List<Order>>(result.Result); } test to get line_items var result= GetOrdersJson(); var lineItems=result[0].line_items; [ { "id": 5287, "name": "John Guest 3/8 to 1/4 Fitting PI0112f4S", "product_id": 5699, "variation_id": 0, "quantity": 1, "tax_class": "", "subtotal": "2.50", "subtotal_tax": "0.00", "total": "2.50", "total_tax": "0.00", "taxes": [], "meta_data": [ { "id": 48648, "key": "_WCPA_order_meta_data", "value": "", "display_key": "_WCPA_order_meta_data", "display_value": "" } ], "sku": "", "price": 2.5, "parent_name": null } ] classes public class Order { public int id { get; set; } public int parent_id { get; set; } public string status { get; set; } public string currency { get; set; } public string version { get; set; } public bool prices_include_tax { get; set; } public DateTime date_created { get; set; } public DateTime date_modified { get; set; } public string discount_total { get; set; } public string discount_tax { get; set; } public string shipping_total { get; set; } public string shipping_tax { get; set; } public string cart_tax { get; set; } public string total { get; set; } public string total_tax { get; set; } public int customer_id { get; set; } public string order_key { get; set; } public Billing billing { get; set; } public Shipping shipping { get; set; } public string payment_method { get; set; } public string payment_method_title { get; set; } public string transaction_id { get; set; } public string customer_ip_address { get; set; } public string customer_user_agent { get; set; } public string created_via { get; set; } public string customer_note { get; set; } public object date_completed { get; set; } public object date_paid { get; set; } public string cart_hash { get; set; } public string number { get; set; } public List<MetaData> meta_data { get; set; } public List<LineItem> line_items { get; set; } public List<object> tax_lines { get; set; } public List<ShippingLine> shipping_lines { get; set; } public List<object> fee_lines { get; set; } public List<object> coupon_lines { get; set; } public List<object> refunds { get; set; } public DateTime date_created_gmt { get; set; } public DateTime date_modified_gmt { get; set; } public object date_completed_gmt { get; set; } public object date_paid_gmt { get; set; } public string currency_symbol { get; set; } public Links _links { get; set; } } public class Billing { public string first_name { get; set; } public string last_name { get; set; } public string company { get; set; } public string address_1 { get; set; } public string address_2 { get; set; } public string city { get; set; } public string state { get; set; } public string postcode { get; set; } public string country { get; set; } public string email { get; set; } public string phone { get; set; } } public class Shipping { public string first_name { get; set; } public string last_name { get; set; } public string company { get; set; } public string address_1 { get; set; } public string address_2 { get; set; } public string city { get; set; } public string state { get; set; } public string postcode { get; set; } public string country { get; set; } public string phone { get; set; } } public class MetaData { public int id { get; set; } public string key { get; set; } public string value { get; set; } public string display_key { get; set; } public string display_value { get; set; } } public class LineItem { public int id { get; set; } public string name { get; set; } public int product_id { get; set; } public int variation_id { get; set; } public int quantity { get; set; } public string tax_class { get; set; } public string subtotal { get; set; } public string subtotal_tax { get; set; } public string total { get; set; } public string total_tax { get; set; } public List<object> taxes { get; set; } public List<MetaData> meta_data { get; set; } public string sku { get; set; } public double price { get; set; } public object parent_name { get; set; } } public class ShippingLine { public int id { get; set; } public string method_title { get; set; } public string method_id { get; set; } public string instance_id { get; set; } public string total { get; set; } public string total_tax { get; set; } public List<object> taxes { get; set; } public List<MetaData> meta_data { get; set; } } public class Self { public string href { get; set; } } public class Collection { public string href { get; set; } } public class Customer { public string href { get; set; } } public class Links { public List<Self> self { get; set; } public List<Collection> collection { get; set; } public List<Customer> customer { get; set; } }
IEnumerable<T> is not a valid type for the serializer. It doesn't define any concrete implementation of a collection for the serializer to parse the JSON into. Use List<T> when deserializing JSON arrays.
public List<Order> GetOrdersJson() { var result = _httpRequestService.CallApi(_url).Content.ReadAsStringAsync(); return _httpRequestService.DeserializeApiResponseJson<Order>(result.Result); } Deserializing List<Order> which is not the Deserializer is expecting. Try return _httpRequestService.DeserializeApiResponseJson<Order> instead
Exception when deserializing a Json string to an user defined object
I'm having a problem that raises an exception Newtonsoft.Json.JsonSerializationException in Newtonsoft.Json.dll when trying to deserialize an Json formatted string to an user defined object. The string that I'm reading from the file has been written before using the same object. This is the code of deserielization (exception at the last line). storageFile = await storageFolder.GetFileAsync(filePath); string JsonDB = await FileIO.ReadTextAsync(storageFile); MyDB myDB = Newtonsoft.Json.JsonConvert.DeserializeObject<MyDB>(JsonDB); Here is the object class (Tag and Astro are enums): public class MyDB { public string Version; public DateTime Date; public List<PhotoSpot_v0_1> Lista_v0_1; } public enum version { v0_1 } public class PhotoSpot_v0_1 { public int ID { get; set; } public string Title { get; set; } public string Description { get; set; } public int Rating { get; set; } public bool Reminder { get; set; } public bool Toast { get; set; } private double Latitude { get; set; } private double Longitude { get; set; } private double Altitude { get; set; } public Geopoint Geopoint { get; set; } public Geopoint Landmark { get; set; } public TimeZoneInfo TimeZone { get; set; } public string MainTag { get; set; } public version Version { get; set; } public Landmark_v0_1 Landmarks { get; set; } public List<Image_v0_1> Images { get; set; } public List<URL_v0_1> URLs { get; set; } public List<globalVars.Tag> Tags { get; set; } public List<Date_v0_1> Dates { get; set; } public bool Downloaded { get; set; } public bool Exportable { get; set; } } public class Landmark_v0_1 { public bool freeLandmark { get; set; } public string Title { get; set; } private double Latitude { get; set; } private double Longitude { get; set; } private double Altitude { get; set; } public globalVars.Astro Astro { get; set; } } public class Image_v0_1 { public string imageURI { get; set; } public bool isDownloaded { get; set; } } public class URL_v0_1 { public string sURL { get; set; } } public class Tag_v0_1 { //public string TagName { get; set; } public globalVars.TagImageURL TagName { get; set; } } public class Date_v0_1 { private double DateStart; private double DateEnd; public DateTime DateTimeStart() { return CoreTime.JDToDateTime(DateStart); } public DateTime DateTimeEnd() { return CoreTime.JDToDateTime(DateEnd); } public void SetDateTimeStart(DateTime dt) { DateStart = CoreTime.DateTimeToJD(dt); } public void SetDateTimeEnd(DateTime dt) { DateEnd = CoreTime.DateTimeToJD(dt); } } I've checked that the Json string, before writing, after writing and when read are the same. Here it is if it's helpful. If something more is needed I'll post it. { "Version": "v0_1", "Date": "2020-01-08T10:49:04.6992512+01:00", "Lista_v0_1": [ { "ID": 2, "Title": "Abadi gaztelua", "Description": "", "Rating": 0, "Reminder": false, "Toast": false, "Geopoint": { "Position": { "Latitude": 43.380954170570355, "Longitude": -1.7520569699123154, "Altitude": 87.749645113013685 }, "AltitudeReferenceSystem": 2, "GeoshapeType": 0, "SpatialReferenceId": 4326 }, "Landmark": null, "TimeZone": { "Id": "Romance Standard Time", "DisplayName": "(UTC+01:00) Brussels, Copenhagen, Madrid, Paris", "StandardName": "Romance Standard Time", "DaylightName": "Romance Daylight Time", "BaseUtcOffset": "01:00:00", "SupportsDaylightSavingTime": true }, "MainTag": "Monument", "Version": 0, "Landmarks": { "freeLandmark": false, "Title": null, "Astro": 0 }, "Images": [], "URLs": [], "Tags": [], "Dates": [], "Downloaded": false, "Exportable": true } ] }
I think your class is not proper. I tried your code and it's working. string filepath = "../../../json.txt"; var test = File.ReadAllText(filepath); Example myDB = JsonConvert.DeserializeObject<Example>(test); pl check your following class as per your json public class Position { public double Latitude { get; set; } public double Longitude { get; set; } public double Altitude { get; set; } } public class Geopoint { public Position Position { get; set; } public int AltitudeReferenceSystem { get; set; } public int GeoshapeType { get; set; } public int SpatialReferenceId { get; set; } } public class TimeZone { public string Id { get; set; } public string DisplayName { get; set; } public string StandardName { get; set; } public string DaylightName { get; set; } public string BaseUtcOffset { get; set; } public bool SupportsDaylightSavingTime { get; set; } } public class Landmarks { public bool freeLandmark { get; set; } public object Title { get; set; } public int Astro { get; set; } } public class ListaV01 { public int ID { get; set; } public string Title { get; set; } public string Description { get; set; } public int Rating { get; set; } public bool Reminder { get; set; } public bool Toast { get; set; } public Geopoint Geopoint { get; set; } public object Landmark { get; set; } public TimeZone TimeZone { get; set; } public string MainTag { get; set; } public int Version { get; set; } public Landmarks Landmarks { get; set; } public IList<object> Images { get; set; } public IList<object> URLs { get; set; } public IList<object> Tags { get; set; } public IList<object> Dates { get; set; } public bool Downloaded { get; set; } public bool Exportable { get; set; } } public class MyDB { public string Version { get; set; } public DateTime Date { get; set; } public IList<ListaV01> Lista_v0_1 { get; set; } }
How to fix deserialization in Json with multiple classes <null in object reference>
I am able to deserialise root object but cannot access the underlying classes I receive a null reference exception. I need to extract the fields from the orderitems class. in the following scenario the derserialization works great and can extract fields attached to items var Sresponse = JsonConvert.DeserializeObject<RootObject>(json); Console.WriteLine(Sresponse.items); However doesn't work here var Sresponse = JsonConvert.DeserializeObject<Item>(json); Console.WriteLine(Sresponse.orderitems); Error message : System.NullReferenceException: Object reference not set to an instance of an object please help. Json String { "totalcount": 103952, "items": [ { "orderid": 113951, "email": "", "namefirst": "", "namelast": "", "company": "", "moneyfinal_net": "95.92", "moneyfinal_vat": "23.98", "moneytotal_gross_roundoff": "0.00", "moneytotal_gross_all": "119.90", "checkouttypename": "Card", "deliverytypename": "", "orderdate": 1554836745, "orderstateid": 10, "paymentstateid": 20, "ordertypeid": 10, "registerid": "{AD16AEE2-235F-318A-4323-6B63EC2C40E7}", "warehouseid": 18, "datereserved": null, "currencycode": "NOK", "additionaldata": { "pos-timezone": "Europe/Oslo", "pos-staff-externalid": "4654" }, "orderitems": [ { "orderitemid": 0, "orderitemtype": 10, "productid": 5486, "productname": "Test", "sku": "320991800016", "productattributes": "", "externalinput": "", "externalinputtitle": "", "unitlabel": "ST", "quantity": 1, "decimalunitquantity": null, "moneynetpriceperunit": "63.92", "moneypriceorg": "0.00", "vatvalue": 25, "deliveryinfo": "", "moneyitemtotal_net": "63.92", "moneyitemtotal_vat": "15.98", "voucherid": 0, "vouchercode": "", "vouchername": "", "moneyoriginalprice": "63.92", "moneydiscountedprice": "0.00", "moneydiscount": "0.00", "salestaxes": [], "additionaldata": {}, "decimalquantitytotal": "1.000", "moneynetpriceperquantity": "63.92" }, Classes public class Orderitem { public int orderitemid { get; set; } public int orderitemtype { get; set; } public int productid { get; set; } public string productname { get; set; } public string sku { get; set; } public string productattributes { get; set; } public string externalinput { get; set; } public string externalinputtitle { get; set; } public string unitlabel { get; set; } public int quantity { get; set; } public object decimalunitquantity { get; set; } public string moneynetpriceperunit { get; set; } public string moneypriceorg { get; set; } public int vatvalue { get; set; } public string deliveryinfo { get; set; } public string moneyitemtotal_net { get; set; } public string moneyitemtotal_vat { get; set; } public int voucherid { get; set; } public string vouchercode { get; set; } public string vouchername { get; set; } public string moneyoriginalprice { get; set; } public string moneydiscountedprice { get; set; } public string moneydiscount { get; set; } public List<object> salestaxes { get; set; } public string decimalquantitytotal { get; set; } public string moneynetpriceperquantity { get; set; } } public class Item { public int orderid { get; set; } public string moneyfinal_net { get; set; } public string checkouttypename { get; set; } public int orderdate { get; set; } public int orderstateid { get; set; } public string registerid { get; set; } public int warehouseid { get; set; } public string currencycode { get; set; } public List<Orderitem> orderitems { get; set; } public class RootObject { public int totalcount { get; set; } public List<Item> items { get; set; } }
Firstly, after fixing your JSON string which is incorrectly defined in the question and then using this Model structure in your case: Note: For parsing Property names with special characters (like -) in your JSON, you can use the JSONProperty attribute as shown below to parse out those properties. public class Additionaldata { [JsonProperty(PropertyName = "pos-timezone")] public string postimezone { get; set; } [JsonProperty(PropertyName = "pos-staff-externalid")] public string posstaffexternalid { get; set; } } public class Orderitem { public int orderitemid { get; set; } public int orderitemtype { get; set; } public int productid { get; set; } public string productname { get; set; } public string sku { get; set; } public string productattributes { get; set; } public string externalinput { get; set; } public string externalinputtitle { get; set; } public string unitlabel { get; set; } public int quantity { get; set; } public object decimalunitquantity { get; set; } public string moneynetpriceperunit { get; set; } public string moneypriceorg { get; set; } public int vatvalue { get; set; } public string deliveryinfo { get; set; } public string moneyitemtotal_net { get; set; } public string moneyitemtotal_vat { get; set; } public int voucherid { get; set; } public string vouchercode { get; set; } public string vouchername { get; set; } public string moneyoriginalprice { get; set; } public string moneydiscountedprice { get; set; } public string moneydiscount { get; set; } public List<object> salestaxes { get; set; } public Additionaldata additionaldata { get; set; } public string decimalquantitytotal { get; set; } public string moneynetpriceperquantity { get; set; } } public class Item { public int orderid { get; set; } public string email { get; set; } public string namefirst { get; set; } public string namelast { get; set; } public string company { get; set; } public string moneyfinal_net { get; set; } public string moneyfinal_vat { get; set; } public string moneytotal_gross_roundoff { get; set; } public string moneytotal_gross_all { get; set; } public string checkouttypename { get; set; } public string deliverytypename { get; set; } public int orderdate { get; set; } public int orderstateid { get; set; } public int paymentstateid { get; set; } public int ordertypeid { get; set; } public string registerid { get; set; } public int warehouseid { get; set; } public object datereserved { get; set; } public string currencycode { get; set; } public Additionaldata additionaldata { get; set; } public List<Orderitem> orderitems { get; set; } } public class RootObject { public int totalcount { get; set; } public List<Item> items { get; set; } } And finally deserializing it: using System; using Newtonsoft.Json; using System.Collections.Generic; public class Program { public static void Main() { string json=#"{'totalcount':103952,'items':[{'orderid':113951,'email':'','namefirst':'','namelast':'','company':'','moneyfinal_net':'95.92','moneyfinal_vat':'23.98','moneytotal_gross_roundoff':'0.00','moneytotal_gross_all':'119.90','checkouttypename':'Card','deliverytypename':'','orderdate':1554836745,'orderstateid':10,'paymentstateid':20,'ordertypeid':10,'registerid':'{AD16AEE2-235F-318A-4323-6B63EC2C40E7}','warehouseid':18,'datereserved':null,'currencycode':'NOK','additionaldata':{'pos-timezone':'Europe/Oslo','pos-staff-externalid':'4654'},'orderitems':[{'orderitemid':0,'orderitemtype':10,'productid':5486,'productname':'Test','sku':'320991800016','productattributes':'','externalinput':'','externalinputtitle':'','unitlabel':'ST','quantity':1,'decimalunitquantity':null,'moneynetpriceperunit':'63.92','moneypriceorg':'0.00','vatvalue':25,'deliveryinfo':'','moneyitemtotal_net':'63.92','moneyitemtotal_vat':'15.98','voucherid':0,'vouchercode':'','vouchername':'','moneyoriginalprice':'63.92','moneydiscountedprice':'0.00','moneydiscount':'0.00','salestaxes':[],'additionaldata':{},'decimalquantitytotal':'1.000','moneynetpriceperquantity':'63.92'}]}]}"; var Sresponse = JsonConvert.DeserializeObject<RootObject>(json); Console.WriteLine(Sresponse.totalcount); foreach(var result in Sresponse.items) { Console.WriteLine(result.moneyfinal_net); Console.WriteLine(result.additionaldata.postimezone); foreach(var result1 in result.orderitems) { Console.WriteLine(result1.orderitemid); Console.WriteLine(result1.orderitemtype); Console.WriteLine(result1.productid); Console.WriteLine(result1.productname); Console.WriteLine(result1.sku); } } } } Outputs: 103952 95.92 Europe/Oslo 0 10 5486 Test 320991800016 Working Example: https://dotnetfiddle.net/kGXBQ0
Json string to C# Object - Array into JsonString
I'm receiving a JSON string in C#, like this : { "Id": "617723", "Acronym": "", "FirstName": "XXXXX", "LastName": "XXXXX", "Groupe": { "Code": "XXXXX", "Traductions": { "French": "", "English": "XXXXX" } }, "BusinessUnit": { "Code": "XXXXX", "Traductions": { "French": "", "English": "XXXXX" } }, "Team": { "Code": null, "Traductions": { "French": "", "English": null } }, "Title": { "Code": null, "Traductions": { "French": "", "English": "XXXXX" } }, "Title2": { "Code": null, "Traductions": { "French": "", "English": null } }, "JobCategory": { "Code": "XXXXX", "Traductions": { "French": "", "English": "XXXXX" } }, "PhoneList": [], "DateHired": "XXXXX", "DateTerminated": "XXXXX", "Gender": "XXXXX", "ManagerId": "XXXXX", "ManagerAcronym": "XXXXX", "IsManager": false, "Email": null, "CarLicense": null, "MyTeam": [], "HomeBase": { "Code": "XXXXX", "Traductions": { "French": "XXXXX", "English": "XXXXX" } }, "Country": { "Code": "XXXXX", "Traductions": { "French": "XXXXXX", "English": "XXXXX" } }, "State": { "Code": "XXXXX", "Traductions": { "French": "XXXXX", "English": "XXXXX" } }, "City": { "Code": "XXXXX", "Traductions": { "French": "XXXXX", "English": "XXXXX" } }, "ShirtSize": "", "LanguageAddressBook": "XXXXX", "LanguagePrefered": null, "Local": null, "Mailbox": null, "HomeBusinessUnit": "1", "JobType": "XXXXXX", "UnionCode": "", "ProfessionalTitle": { "Code": null, "Traductions": { "French": "", "English": null } }, "IconEmailActif": true, "IconSkypeActif": true } I want to convert it in a C# Object, so I made my Model like this : public class UsersJson { public string Acronym { get; set; } public string[] BusinessUnit { get; set; } public string CarLicense { get; set; } public string[] City { get; set; } public string[] Country { get; set; } public string DateHired { get; set; } public string DateTerminated { get; set; } public string Email { get; set; } public string FirstName { get; set; } public string Gender { get; set; } public string[] Groupe { get; set; } public string[] HomeBase { get; set; } public string HomeBusinessUnit { get; set; } public bool IconEmailActif { get; set; } public bool IconSkypeActif { get; set; } public string Id { get; set; } public bool IsManager { get; set; } public string[] JobCategory { get; set; } public string JobType { get; set; } public string LanguageAddressBook { get; set; } public string LanguagePrefered { get; set; } public string LastName { get; set; } public string Local { get; set; } public string Mailbox { get; set; } public string ManagerAcronym { get; set; } public string ManagerId { get; set; } public string[] MyTeam { get; set; } public string[] PhoneList { get; set; } public string[] ProfessionalTitle { get; set; } public string ShirtSize { get; set; } public string[] State { get; set; } public string[] Team { get; set; } public string[] Title { get; set; } public string[] Title2 { get; set; } public string UnionCode { get; set; } } When I try to Deserialize it into a List<UsersJson>, I get the following error : Cannot deserialize the current JSON object (e.g. {\"name\":\"value\"}) into type 'System.String[]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly. To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. Path '[0].Groupe.Code', line 1, position 87." So, how should I declare the property Group if it's not a string[] ?
Use the correct classes. I followed the steps outlined here and refactored a bit: RootObject r = JsonConvert.DeserializeObject<RootObject>(json); public class Traductions { public string French { get; set; } public string English { get; set; } } public class Groupe { public string Code { get; set; } public Traductions Traductions { get; set; } } public class BusinessUnit { public string Code { get; set; } public Traductions Traductions { get; set; } } public class Team { public string Code { get; set; } public Traductions Traductions { get; set; } } public class Title { public string Code { get; set; } public Traductions Traductions { get; set; } } public class JobCategory { public string Code { get; set; } public Traductions Traductions { get; set; } } public class HomeBase { public string Code { get; set; } public Traductions Traductions { get; set; } } public class Country { public string Code { get; set; } public Traductions Traductions { get; set; } } public class State { public string Code { get; set; } public Traductions Traductions { get; set; } } public class City { public string Code { get; set; } public Traductions Traductions { get; set; } } public class ProfessionalTitle { public string Code { get; set; } public Traductions Traductions { get; set; } } public class RootObject { public string Id { get; set; } public string Acronym { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public Groupe Groupe { get; set; } public BusinessUnit BusinessUnit { get; set; } public Team Team { get; set; } public Title Title { get; set; } public Title Title2 { get; set; } public JobCategory JobCategory { get; set; } public List<object> PhoneList { get; set; } public string DateHired { get; set; } public string DateTerminated { get; set; } public string Gender { get; set; } public string ManagerId { get; set; } public string ManagerAcronym { get; set; } public bool IsManager { get; set; } public string Email { get; set; } public string CarLicense { get; set; } public List<object> MyTeam { get; set; } public HomeBase HomeBase { get; set; } public Country Country { get; set; } public State State { get; set; } public City City { get; set; } public string ShirtSize { get; set; } public string LanguageAddressBook { get; set; } public string LanguagePrefered { get; set; } public string Local { get; set; } public string Mailbox { get; set; } public string HomeBusinessUnit { get; set; } public string JobType { get; set; } public string UnionCode { get; set; } public ProfessionalTitle ProfessionalTitle { get; set; } public bool IconEmailActif { get; set; } public bool IconSkypeActif { get; set; } }
You'll need another couple of classes with the Code and Traductions properties. public class Groupe { public string Code { get; set; } public Traductions Traductions { get; set; } } public class Traductions { public string French { get; set; } public string English { get; set; } } Use Groupe in place of string[] in your base class and you should be golden :)
The accepted answer works, but I feel it has a lot of code-repetition. You only need two other model classes for this to work: public class Traductions { public string French { get; set; } public string English { get; set; } } public class CodeTraduction { public string Code { get; set; } public Traductions Traductions { get; set; } } public class RootObject { public string Id { get; set; } public string Acronym { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public CodeTraduction Groupe { get; set; } public CodeTraduction BusinessUnit { get; set; } public CodeTraduction Team { get; set; } public CodeTraduction Title { get; set; } public CodeTraduction Title2 { get; set; } public CodeTraduction JobCategory { get; set; } public List<object> PhoneList { get; set; } public string DateHired { get; set; } public string DateTerminated { get; set; } public string Gender { get; set; } public string ManagerId { get; set; } public string ManagerAcronym { get; set; } public bool IsManager { get; set; } public string Email { get; set; } public string CarLicense { get; set; } public List<object> MyTeam { get; set; } public CodeTraduction HomeBase { get; set; } public CodeTraduction Country { get; set; } public CodeTraduction State { get; set; } public CodeTraduction City { get; set; } public string ShirtSize { get; set; } public string LanguageAddressBook { get; set; } public string LanguagePrefered { get; set; } public string Local { get; set; } public string Mailbox { get; set; } public string HomeBusinessUnit { get; set; } public string JobType { get; set; } public string UnionCode { get; set; } public CodeTraduction ProfessionalTitle { get; set; } public bool IconEmailActif { get; set; } public bool IconSkypeActif { get; set; } } Using your example JSON, you would deserialize it like this: var item = JsonConvert.DeserializeObject<RootObject>(json); You can create separate classes if you wish, but keep a single base-class CodeTraduction, for example: public class Groupe : CodeTraduction { //Add any "Groupe" specific properties here }
For future reference, you can also use Paste Special. You copy the JSON file(Ctrl+C) and add a new class file, if you dont already have one. Then you go in to Edit(at the top left of VS) and hover your cursor over Paste Special, you will get two options, one for XML as Class or JSON as Class. Hope it helps you and others in the future. :)
GitLab WebHook post-receive with WebAPI
I am trying to use GitLab webhook 'Push events' to notify users when there are changes in the file. According to this GitLab help I should receive this as the request body: { "object_kind": "push", "before": "95790bf891e76fee5e1747ab589903a6a1f80f22", "after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", "ref": "refs/heads/master", "user_id": 4, "user_name": "John Smith", "user_email": "john#example.com", "project_id": 15, "repository": { "name": "Diaspora", "url": "git#example.com:mike/diasporadiaspora.git", "description": "", "homepage": "http://example.com/mike/diaspora", "git_http_url":"http://example.com/mike/diaspora.git", "git_ssh_url":"git#example.com:mike/diaspora.git", "visibility_level":0 }, "commits": [ { "id": "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327", "message": "Update Catalan translation to e38cb41.", "timestamp": "2011-12-12T14:27:31+02:00", "url": "http://example.com/mike/diaspora/commit/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327", "author": { "name": "Jordi Mallach", "email": "jordi#softcatala.org" } }, { "id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", "message": "fixed readme", "timestamp": "2012-01-03T23:36:29+02:00", "url": "http://example.com/mike/diaspora/commit/da1560886d4f094c3e6c9ef40349f7d38b5d27d7", "author": { "name": "GitLab dev user", "email": "gitlabdev#dv6700.(none)" } } ], "total_commits_count": 4 } but my WebAPI method is not resolving this request right, the things I tried are public async Task Post() public void Post([FromBody] dynamic value) public void Post([FromBody] PushEvent value) (strongly typed) none of the above approaches seems to work, however trying this in ruby as shown in example method does work. So I suppose this is something that have to do with the way I am using the web API. Any thoughts? My PushEvent Class looks like this: public class PushEvent { public string name { get; set; } public string url { get; set; } public string description { get; set; } public string homepage { get; set; } public string git_http_url { get; set; } public string git_ssh_url { get; set; } public int visibility_level { get; set; } public string object_kind { get; set; } public string before { get; set; } public string after { get; set; } public int user_id { get; set; } public string user_name { get; set; } public string user_email { get; set; } public int project_id { get; set; } public IList<Commit> commits { get; set; } public int total_commits_count { get; set; } public class Author { public string name { get; set; } public string email { get; set; } } public class Commit { public string id { get; set; } public string message { get; set; } public DateTime timestamp { get; set; } public string url { get; set; } public Author author { get; set; } } }
I' ve met the same question,and my problem was caused by PAI code the following is my code: pushEvents: namespace LuckyGitlabStatWebAPI.Models { public class PushEvent { public string object_kind { get; set; } public string before { get; set; } public string after { get; set; } public string #ref { get; set; } public int user_id { get; set; } public string user_name { get; set; } public string user_email { get; set; } public string user_avatar { get; set; } public int project_id { get; set; } public project project; public repository repository; public List<commits> commits; public int total_commits_count { get; set; } } public class project { public string name { get; set; } public string description { get; set; } public string web_url { get; set; } public string avatar_url { get; set; } public string git_ssh_url { get; set; } public string git_http_url { get; set; } public string #namespace { get; set; } public int visibility_level { get; set; } public string path_with_namespace { get; set; } public string default_branch { get; set; } public string homepage { get; set; } public string url { get; set; } public string ssh_url { get; set; } public string http_url { get; set; } } public class repository { public string name { get; set; } public string url { get; set; } public string description { get; set; } public string homepage { get; set; } public string git_http_url { get; set; } public string git_ssh_url { get; set; } public int visibility_level { get; set; } } public class commits { public string id { get; set; } public string message { get; set; } public string timestamp { get; set; } public string url { get; set; } public string added { get; set; } public Array modified; public Array removed { get; set; } public author author; } public class author { public string name { get; set; } public string email { get; set; } } } API :how to get push info from gitlab hooks with .NET
I did find what the problem was, This was due to authentication. Once I allow the method to allow anonmymous, the method was successfully hit.