2017-05-15 6 views
0

Ich habe dieses Code-Snippet von meiner Methode. Es sollte alle Teile der Liste test.E_id schreiben, aber es schreibt nichts. Ich weiß nicht, was ich falsch mache.JSON mit mehreren Werten lesen

string jsonText = File.ReadAllText(jsonFilePath); 
Execution test = JsonConvert.DeserializeObject<Execution>(jsonText); 
    foreach (string eID in test.E_id) 
    { 
     Console.WriteLine(eID); 
    } 

Das ist meine Ausführungsklasse ist neben dem Schreiben der Saiten funktioniert gut.

public class Execution 
{ 
    public string Usr_id { get; private set; } 
    public string Patient_id { get; private set; } 
    public List<string> E_id { get; private set; } 
    public List<string> E_title { get; private set; } 
    public List<string> E_description { get; private set; } 
    public List<string> E_date { get; private set; } 
    public List<string> E_delete { get; private set; } 

    public Execution(string usr_id, string patient_id, List<string> e_id, List<string> e_title, List<string> e_description, 
    List<string> e_date, List<string> e_delete) 
    { 
     Usr_id = usr_id; 
     Patient_id = patient_id; 
     E_id = e_id; 
     E_title = e_title; 
     E_description = e_description; 
     E_date = e_date; 
     E_delete = e_delete; 
    } 
} 

Und hier ist die JSON-Datei i aus lesen möchten:

{ 
    "usr_id":"573", 
    "patient_id":"170510024", 
    "executions":[ 
     { 
      "id":"SF70H", 
      "title":"Verbandswechsel", 
      "description":"Verband des rechten Armes wechseln", 
      "date":"2017-07-28T12:00:00.000Z", 
      "delete":false 
     }, 
     { 
      "id":"SF18H", 
      "title":"Physiotherapie", 
      "description":"Beweglichkeit des Knies wiederherstellen", 
      "date":"2017-07-28T14:00:00.000Z", 
      "delete":false 
     } 
    ] 

Vielleicht, was jemand weiß ich falsch gemacht und kann mir helfen, meinen Fehler zu finden. }

+1

Ich habe das starke Gefühl, dass C# -Klasse ist nicht gleichbedeutend mit JSON-Struktur. Kopieren Sie Ihre JSON und in entweder Ansicht oder Bearbeiten-Menü in Visual Studio gibt es einfügen spezielle Menü klicken Sie dort, die C# -Klasse für die kopierte JSON-Struktur erstellen wird. Außerdem sollten Sie den Ausführungskonstruktor entfernen. –

+0

https://www.google.com/search?q=visual+studio+paste+json+as+class –

Antwort

2

Ihr Problem ist, dass Ihr JSON und der Code nicht miteinander übereinstimmen. Sie haben Listen für einzelne Felder, Sie falsche Namen, usw.

Mit dieser C#, die auf Ihre JSON-Karten (generiert aus json2csharp.com):

public class Execution 
{ 
    public string id { get; set; } 
    public string title { get; set; } 
    public string description { get; set; } 
    public DateTime date { get; set; } 
    public bool delete { get; set; } 
} 

public class Test 
{ 
    public string usr_id { get; set; } 
    public string patient_id { get; set; } 
    public List<Execution> executions { get; set; } 
} 

Dann dieses C# -Code verwenden:

Test test = JsonConvert.DeserializeObject<Test>(jsonText); 
+3

Ich würde dringend empfehlen * nicht * mit dieser C# direkt obwohl - stattdessen geben Dinge C# -idiomatische Namen und Verwenden von '[JsonProperty]', um den Namen anzugeben, der in JSON verwendet/analysiert werden soll. –

+0

Das ist ein guter Vorschlag, aber oft für die meisten Neulinge eine Brücke zu weit. –

+2

Gute Angewohnheit, um in zu gehen - ich schlage nicht vor, den Beispielcode zu ändern, sondern nur einen Vorschlag am Ende der Antwort hinzuzufügen. –

1

Ihre Codestruktur stimmt nicht mit Ihrer JSON-Struktur überein. Da Sie die Struktur der JSON-Datei bereits kannten, gibt es in Visual Studio ein praktisches Tool, mit dem Sie Code daraus generieren können.

die Struktur JSON Wählen Sie in der Datei ->Ctrl +C -> Visual Studio -> Bearbeiten -> Einfügen Spezial -> Einfügen JSON als Klassen.

Dies ergibt folgendes Ergebnis:

public class Rootobject 
{ 
    public string usr_id { get; set; } 
    public string patient_id { get; set; } 
    public Execution[] executions { get; set; } 
} 

public class Execution 
{ 
    public string id { get; set; } 
    public string title { get; set; } 
    public string description { get; set; } 
    public DateTime date { get; set; } 
    public bool delete { get; set; } 
} 

Jetzt können Sie dekorieren mit JsonProperty Attribute und die Namen zu den C# Normen machen:

public class Rootobject 
{ 
    [JsonProperty("usr_id")] 
    public string UserId { get; set; } 
    [JsonProperty("patient_id")] 
    public string PatientId { get; set; } 
    [JsonProperty("executions ")] 
    public Execution[] Executions { get; set; } 
} 

public class Execution 
{ 
    [JsonProperty("id")] 
    public string Id { get; set; } 
    [JsonProperty("title")] 
    public string Title { get; set; } 
    [JsonProperty("description")] 
    public string Description { get; set; } 
    [JsonProperty("datee")] 
    public DateTime Date { get; set; } 
    [JsonProperty("delete")] 
    public bool Delete { get; set; } 
} 
0

Dieser Code fein gearbeitet:

public class ExecutionOrder 
{ 
    public string Usr_id { get; set; } 
    public string Patient_id { get; set; } 
    public List<Execution> Executions { get; set; } 

    public ExecutionOrder(string usr_id, string patient_id, List<Execution> executions) 
    { 
     Usr_id = usr_id; 
     Patient_id = patient_id; 
     Executions = executions; 
    } 

} 

public class Execution 
{ 
    public string E_id { get; set; } 
    public string E_title { get; set; } 
    public string E_description { get; set; } 
    public string E_date { get; set; } 
    public bool E_delete { get; set; } 

    public Execution(string e_id, string e_title, string e_description, string e_date, bool e_delete) 
    { 
     E_id = e_id; 
     E_title = e_title; 
     E_description = e_description; 
     E_date = e_date; 
     E_delete = e_delete; 
    } 

} 

Aber jetzt habe ich ein anderes Problem, ich möchte die Strings und t lesen Er boole vom Execution-Objekt und drucke es im CommandWindow. Ich kann die Usr_id und die Patient_id ohne irgendwelche Probleme drucken, und die bool von dem Objekt wird auch gezeigt. Aber es druckt die Zeichenfolgen nicht. Ist es der richtige Weg, die Strings aus dem Objekt zu lesen?

ExecutionOrder test = JsonConvert.DeserializeObject<ExecutionOrder>(jsonText); 
test.Executions.ForEach(delegate(Execution exec) 
{ 
    Console.WriteLine(test.Usr_id); 
    Console.WriteLine(test.Patient_id); 
    Console.WriteLine(exec.E_id); 
    Console.WriteLine(exec.E_title); 
    Console.WriteLine(exec.E_description); 
    Console.WriteLine(exec.E_date); 
    Console.WriteLine(exec.E_delete); 
    Console.WriteLine(); 
});