Doel: Maken van een Android app, geschreven in Visual Studio 2017 met Xamarin en C#.
Waar ligt het probleem: Het opslaan van een property "id" uit een nested object "project" in een JSON stream.
Ik heb twee JSON streams die ik in een SQLite database wil zetten. Deze streams krijg ik terug van een API en kan ik kwa structuur niet aanpassen. Het gaat hier om een Model Project en een Model Task, waarbij een Project object meerdere Task objecten kan hebben.
De JSON met een array van Project objecten:
De JSON met een array van Task objecten:
De models / classes zien er als volgt uit:
Het Deserializen en Inserten in de database gaat via de volgende Method:
Nu gaat eigenlijk alles goed, behalve het opslaan van het ProjectId in het Task object. Via Methods, die hier niet staan weergegeven, worden netjes de database en de tabellen aangemaakt. Met tabel Project, de properties 'Id' en 'Description' en tabel Task, de properties 'Id', 'Description' en ProjectId. Alle Objects uit de JSON worden netjes in de database gezet, alleen blijft de waarde van ProjectId en de records van Task op 0
Project model in de database:

Task model in de database:

Ik heb verschillende varianten van [JsonProperty("ProjectId")] geprobeerd, met Project.Id, project.id e.d. Veel gezocht naar C# JSON Deserialize nested Objects. Er komen dan veel voorbeelden naar voren, maar dit blijken geen Objecten in Objecten te zijn, maar Arrays in Objecten. Ook heb ik de documentatie van Newtonsoft.Json bekeken maar ik word hier niet echt wijzer van.
Waar ligt het probleem: Het opslaan van een property "id" uit een nested object "project" in een JSON stream.
Ik heb twee JSON streams die ik in een SQLite database wil zetten. Deze streams krijg ik terug van een API en kan ik kwa structuur niet aanpassen. Het gaat hier om een Model Project en een Model Task, waarbij een Project object meerdere Task objecten kan hebben.
De JSON met een array van Project objecten:
code:
1
2
3
4
5
6
7
8
9
10
| [ { "id": 3, "description": "Project A" }, { "id": 6, "description": "Project B" } ] |
De JSON met een array van Task objecten:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| [ { "id": 27, "project": { "id": 3, "description": "Project A" }, "description": "Task 1" }, { "id": 30, "project": { "id": 3, "description": "Project A" }, "description": "Task 2" }, { "id": 33, "project": { "id": 6, "description": "Project B" }, "description": "Task 3" }, { "id": 36, "project": { "id": 6, "description": "Project B" }, "description": "Task 4" } ] |
De models / classes zien er als volgt uit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| using Newtonsoft.Json; using SQLite.Net.Attributes; using SQLiteNetExtensions.Attributes; namespace BettyMultiModel.Resources.Model { public class Models { } class Project : Models { [JsonProperty("id"), PrimaryKey] public int Id { get; set; } [JsonProperty("description")] public string Description { get; set; } } class Task : Models { [PrimaryKey] public int Id { get; set; } public string Description { get; set; } [JsonProperty("ProjectId"), ForeignKey(typeof(Project))] // <----- Dit gaat niet goed!!! public int ProjectId { get; set; } [ManyToOne] public Project Project { get; set; } } } |
Het Deserializen en Inserten in de database gaat via de volgende Method:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| using Newtonsoft.Json; . . . // Insert Records of type TType into database. private async Task<string> InsertRecords<TType>(HttpResponseMessage response) where TType : Models { try { DataBase db = new DataBase(); string responseString = await response.Content.ReadAsStringAsync(); var responseBody = JsonConvert.DeserializeObject<List<TType>>(responseString); foreach (TType item in responseBody) { bool resultInsert = db.Insert(item); } return ResponseToMessage(response, "Insert Records"); } catch (Exception ex) { Log.Info("DeserializeObject", ex.Message); throw; } } |
Nu gaat eigenlijk alles goed, behalve het opslaan van het ProjectId in het Task object. Via Methods, die hier niet staan weergegeven, worden netjes de database en de tabellen aangemaakt. Met tabel Project, de properties 'Id' en 'Description' en tabel Task, de properties 'Id', 'Description' en ProjectId. Alle Objects uit de JSON worden netjes in de database gezet, alleen blijft de waarde van ProjectId en de records van Task op 0
Project model in de database:

Task model in de database:

Ik heb verschillende varianten van [JsonProperty("ProjectId")] geprobeerd, met Project.Id, project.id e.d. Veel gezocht naar C# JSON Deserialize nested Objects. Er komen dan veel voorbeelden naar voren, maar dit blijken geen Objecten in Objecten te zijn, maar Arrays in Objecten. Ook heb ik de documentatie van Newtonsoft.Json bekeken maar ik word hier niet echt wijzer van.
[ Voor 6% gewijzigd door Verwijderd op 20-07-2017 12:54 . Reden: Verduidelijking van informatie ]