Json - SelectToken - Daten summieren, die ein bestimmtes Alter haben.



  • Hi
    Ich habe viele Werte, im Json-Format vorliegen.
    Ich möchte Werte summieren(breads_eaten), die ein bestimmtes Alter überschritten haben, z.B. 10 Tage ab Programm-Aufruf.

    Beispiel:
    "age":"2019-01-20T19:17:12.5348353" // UTC Zeit !!!
    "breads_eaten": 123

    Das Datum age liegt länger als10 Tage zurück, also möchte ich den Wert 123 addieren.

    Im Netz habe ich diese Schnippsel gefunden:

    IEnumerable<JToken> pricyProducts = o.SelectTokens("$..Products[?(@.Price >= 50)].Name"); // hier ist wohl ne Schleife nötig
    decimal totalPrice = o["Manufacturers"].Sum(m => (decimal)m.SelectToken("Products[0].Price")); // hier nicht
    

    Wie kann man diese Schnippel umbauen, damit meine Werte gelesen und summiert werden können? Es soll dabei die lokale Uhrzeit und nicht die in den Werten angegebene UTC-Zeit berücksichtigt werden.



  • Wie kann man diese Schnippel umbauen, damit meine Werte gelesen und summiert werden können? Es soll dabei die lokale Uhrzeit und nicht die in den Werten angegebene UTC-Zeit berücksichtigt werden.

    Ich habe etwas experimentiert, und das läuft soweit, alle gegessenen Brote werden summiert:

    JObject o = JObject.Parse(File.ReadAllText(path));
    decimal summe = o["table.entry"].Sum(m => (decimal)m.SelectToken("breads_eaten")); // OK
    

    Wenn ich jedoch eine Bedingung hinzufüge, bekomme ich eine Fehlermeldung:

    decimal summe = rss["table.entry"].Sum(m => (decimal)m.SelectToken("breads_eaten").Where(n => (DateTime)n["age"] < utc_time)); // FEHLER
    
    Fehler:	Der Typ "System.Collections.Generic.IEnumerable<Newtonsoft.Json.Linq.JToken>" kann nicht in "decimal" konvertiert werden.
    


  • Dieser Beitrag wurde gelöscht!

  • Administrator

    Wenn du LINQ verwenden möchtest, dann arbeite dich am besten ein wenig in die Technologie ein: https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/concepts/linq/getting-started-with-linq

    LINQ Methoden ruft man immer auf IEnumerable<T> auf und kettet sie aneinander. Dein Sum sollte also nach dem Where kommen. Du willst ja zuerst filtrieren und dann summieren. Ob du zudem wirklich decimal einsetzen möchtest, dürfte auch recht fragwürdig sein. Statt Code einfach nur zusammenzukopieren, probiere diesen besser zu verstehen. Damit kommst du deutlich weiter.



  • @Dravere danke für deine Antwort.
    Ja, der Datentyp long reicht dicke aus.
    Wenn ich aber Sum nach Where setze dann gibt's Fehler.
    Wäre nett, wenn du mir ein Beispiel zeigen könntest.


  • Administrator

    public class Program
    {
        public static void Main(String[] args)
        {
            var values = new [] { 1, 2, 3, 4, 5, 6, 7, 8 };
            var result = values.Where(v => v > 4).Sum();
            Console.WriteLine(result);
        }
    }
    

    Womöglich willst du aber nicht über breads_eaten iterieren, sondern zuerst über das Objekt oberhalb, damit du die Filtrierung machen kannst. Du kannst dann mittels dem Parameter an Sum spezifizieren, was von diesem Objekt summiert werden soll.

    Siehe auch die Dokumentation für Where und Sum.



  • @Dravere Wow, super, vielen Dank, das ist lieb von dir!
    Für heute ist für mich die Luft raus, werde mich morgen wieder dran setzen.



  • Wohooooooo jippieeeee juchuuuuuuu es läuft! Sofort nach dem ersten Versuch! 😊

    "Statt Code einfach nur zusammenzukopieren, probiere diesen besser zu verstehen. Damit kommst du deutlich weiter."
    Da hast du natürlich völlig Recht, leider fehlt mir die Zeit tiefer in die Materie einzudringen, es soll einfach nur funktionieren und das tut es ja nun.
    Vielen Dank noch einmal, Dravere! ♥



  • @bruder
    diese einstellung solltest du nochmal überdenken......



  • @Wade1234 sagte in Json - SelectToken - Daten summieren, die ein bestimmtes Alter haben.:

    @bruder
    diese einstellung solltest du nochmal überdenken......

    Naja wenn er niemals professionell Softwareentwicklung machen will, kommt er mit der Einstellung hin. Und für privaten Schmuddelcode ist das dann eben auch ausreichend. Beruflich würde er damit nicht weit kommen, denn sein SeniorDev würde ihn dafür mit dem Kopf zuerst vom Balkon baumeln lassen 😃


Anmelden zum Antworten