2017-01-20 4 views
0

Ich habe eine komplexe JSON Antwort, die ich brauche, um zu analysieren und Daten zu ersetzen.Parse Nested JSON und ersetzen Sie die Daten in C#

Dies ist nur ein Schnipsel ab 1 Tag aber müssen alle Tage in der Antwort zu tun.

Wie kann ich dies analysieren und nur Werte ändern. Ich muss ändern und zurück zum Host senden.

{ 
    "schedulePeriods":` [ 
    { 
     "day": "Monday", 
     "periodType": "WakeOcc1", 
     "startTime": 26, 
     "isCancelled": false, 
     "heatSetpoint": 70.0, 
     "coolSetpoint": 75.0, 
     "fanMode": "Auto" 
    }, 
    { 
     "day": "Monday", 
     "periodType": "LeaveUnocc1", 
     "startTime": 32, 
     "isCancelled": false, 
     "heatSetpoint": 65.0, 
     "coolSetpoint": 75.0, 
     "fanMode": "Auto" 
    }, 
    { 
     "day": "Monday", 
     "periodType": "ReturnOcc2", 
     "startTime": 66, 
     "isCancelled": false, 
     "heatSetpoint": 72.0, 
     "coolSetpoint": 75.0, 
     "fanMode": "Auto" 
    }, 
    { 
     "day": "Monday", 
     "periodType": "SleepUnocc2", 
     "startTime": 0, 
     "isCancelled": false, 
     "heatSetpoint": 65.0, 
     "coolSetpoint": 75.0, 
     "fanMode": "Auto" 
    }, 
    { 
     "day": "Tuesday", 
     "periodType": "WakeOcc1", 
     "startTime": 26, 
     "isCancelled": false, 
     "heatSetpoint": 70.0, 
     "coolSetpoint": 75.0, 
     "fanMode": "Auto" 
    }, 

so, was ich jetzt habe, ist dies: `

class Day 
    { 
     public string day { get; set; } 
     public string periodType { get; set; } 
     public int startTime { get; set; } 
     public double heatSetpoint { get; set; } 
     public double coolSetpoint { get; set; } 


     public override string ToString() 
     { 
      return string.Format("{0}\n{1}\n{2}\n{3}\n{4}", day, periodType, startTime, heatSetpoint, coolSetpoint); 
     } 
    } 

    static void Main(string[] args) 
    { 

     String JSONstring = File.ReadAllText("json.json"); 
     JObject o = JObject.Parse(JSONstring); 


     string day = (string)o.SelectToken("schedulePeriods[0].day"); 
     string periodType = (string)o.SelectToken("schedulePeriods[0].periodType"); 
     int startTime = (int)o.SelectToken("schedulePeriods[0].startTime"); 
     double heatSetpoint = (double)o.SelectToken("schedulePeriods[0].heatSetpoint"); 
     double coolSetpoint = (double)o.SelectToken("schedulePeriods[0].coolSetpoint"); 
     Console.WriteLine("{0}\n{1}\n{2}\n{3}\n{4}",day,periodType,startTime,heatSetpoint,coolSetpoint); 


     Console.WriteLine("Change Value to:"); 
     string answer = Console.ReadLine(); 

     day = answer; 


     Console.WriteLine("new value {0}", day); 
       string data = JsonConvert.SerializeObject(JSONstring,Formatting.Indented); 
      File.WriteAllText("newfile.json", data); 
       Console.ReadLine(); 

}

i die Daten aus dem ersten geschweiften Klammern bekommen können, aber nicht weiter. Ich muss von jedem Array bekommen. Ich möchte auch einen bestimmten Eintrag ändern und dann die bearbeitete Datei mit der richtigen JSON-Formatierung speichern (das funktioniert überhaupt nicht) `

Gelöst. Vielen Dank für Ihr Feedback

+0

Können Sie 'Newtonsoft.Json' aus irgendeinem Grund nicht verwenden? – BradleyDotNET

+0

Erstellen Sie ein Modell in C#, um den Daten in json zu entsprechen. Verwenden Sie so etwas wie Newtonsoft.Json (wie bereits vorgeschlagen), um den eingehenden Json dann in Objekte zu analysieren. Ändern Sie, was Sie brauchen, und verwenden Sie es erneut, um die Objekte wieder in json zu konvertieren. – Chris

+0

Verwenden Sie einfach Newtonss Bibliothek. Erstellen Sie ein Modell, das dem JSON-Schema entspricht. Dann wird das Modell serialisiert oder deserialisiert. Ihr Modell wird mit Daten gefüllt, "deserialisiert" oder Sie erhalten ein gefülltes Modell und serialisieren es wieder in eine Zeichenkette in JSON. - Siehe meine Antwort http://stackoverflow.com/questions/21885243/cannot-deserialize-the-current-json-array-eg-1-2-3/21885758#21885758 – Dayan

Antwort

2

die folgenden Klassen in Ihrer Anwendung erstellen

public class RootObject 
{ 
    public List<SchedulePeriod> schedulePeriods { get; set; } 
} 

public class SchedulePeriod 
{ 
    public string day { get; set; } 
    public string periodType { get; set; } 
    public int startTime { get; set; } 
    public bool isCancelled { get; set; } 
    public double heatSetpoint { get; set; } 
    public double coolSetpoint { get; set; } 
    public string fanMode { get; set; } 
} 

Und dann Newtonsoft.Json benutzen, um Ihre Json wie

public static T DeserializeObject<T>(string jsonObj) 
{ 
    return JsonConvert.DeserializeObject<T>(jsonObj, 
     new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore, Formatting = Formatting.Indented }); 
} 

deserialisieren Und es wie

RootObject obj = DeserializeObject<RootObject>(your_json); 
nennen

dann Zugriff auf Ihre Zeitpläne.

Ich hoffe, es hilft.