Unparseable number: "." bei JSON-Kursquelle

Mich beschleicht immer mehr die Vermutung, dass die JSON Import Funktion nicht rund funktioniert. Nicht nur bei Google Sheet scheint es Probleme zu geben, sondern nun auch mit FRED.

Aber zumindest gibt PP hier wenigsten ein Fehlerlog aus, im Gegensatz zu einigen Google Sheet JSON Quellen :slightly_smiling_face:

Viele FRED Daten funktionieren einwandfrei. Bei einigen zieht PP einfach nichts, obwohl im Serverresponse das JSON Ergebnis einwandfrei zu sehen ist. Auch wenn ich den Link im Browser eingeben alles tutti. Hier ein kleiner Ausschnitt:

{
  "realtime_start": "2021-06-05",
  "realtime_end": "2021-06-05",
  "observation_start": "1600-01-01",
  "observation_end": "9999-12-31",
  "units": "lin",
  "output_type": 1,
  "file_type": "json",
  "order_by": "observation_date",
  "sort_order": "asc",
  "count": 316,
  "offset": 0,
  "limit": 100000,
  "observations": [
    {
      "realtime_start": "2021-06-05",
      "realtime_end": "2021-06-05",
      "date": "1994-11-01",
      "value": "15.69"
    },
    {
      "realtime_start": "2021-06-05",
      "realtime_end": "2021-06-05",
      "date": "1994-12-01",
      "value": "."
    },
    {
      "realtime_start": "2021-06-05",
      "realtime_end": "2021-06-05",
      "date": "1995-01-01",
      "value": "."
    },
    {
      "realtime_start": "2021-06-05",
      "realtime_end": "2021-06-05",
      "date": "1995-02-01",
      "value": "16.10"
    },
    {

Hier ein Bsp. Link (kostenloser API Key unkenntlich):
https://api.stlouisfed.org/fred/series/observations?series_id=TERMCBCCALLNS&api_key=XXXXXXXXX&file_type=json

Im Fehlerlog steht bei den FRED Kursen bei denen PP wie oben nichts zu ziehen scheint folgendes:

Sun Jun 06 00:12:00 CEST 2021
https://api.stlouisfed.org/fred/series/observations?series_id=DJFUELUSGULF&api_key=XXXXXXX&file_type=json
Unparseable number: "."

java.io.IOException: https://api.stlouisfed.org/fred/series/observations?series_id=DJFUELUSGULF&api_key=XXXXXXXXXXXXXX&file_type=json
Unparseable number: "."
	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.parse(GenericJSONQuoteFeed.java:289)
	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.getHistoricalQuotes(GenericJSONQuoteFeed.java:155)
	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.getHistoricalQuotes(GenericJSONQuoteFeed.java:77)
	at name.abuchen.portfolio.online.QuoteFeed.getLatestQuote(QuoteFeed.java:40)
	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.getLatestQuote(GenericJSONQuoteFeed.java:180)
	at name.abuchen.portfolio.ui.jobs.UpdateQuotesJob$1.run(UpdateQuotesJob.java:233)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: java.text.ParseException: Unparseable number: "."
	at java.base/java.text.NumberFormat.parse(Unknown Source)
	at name.abuchen.portfolio.online.impl.YahooHelper.asPrice(YahooHelper.java:32)
	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.extractValue(GenericJSONQuoteFeed.java:299)
	at name.abuchen.portfolio.online.impl.GenericJSONQuoteFeed.parse(GenericJSONQuoteFeed.java:253)
	... 6 more

PP scheint damit Probleme damit zu, dass in vielen Zeilen “.” steht, was bei den FRED Daten durchaus häufig vorkommt (keine Daten für dieses Datum). Beim CSV Import hat PP damit keine Probleme.

Kann man PP so einstellen, dass er bei JSON die “Unparseable” Zeilen einfach auch überspringt?

Ich habe heute das gleiche Problem feststellen dürfen.

Betrifft Werte, die monatlich aktualisiert werden. Die Leerstellen werden von der FRED mit einem Punkt übergeben, was zu der besagten Fehlermeldung führt.

Gibt es da mittlerweile einen Tipp zur Lösung?

Datenverändernden JSON-Proxy, ähnlich wie in „JSON invalid value“ bei Deka-Kurs von 1956 - #6 by ProgFriese

Der müsste

"value": "."

in

"value": "N/A"

verwandeln und an PP durchleiten.

Danke für den Link @ProgFriese

Hab mir das mal angeschaut, aber da bin ich leider raus… mit irgendwas Proxy und Gedöns

Gab es mal Bestrebungen das in PP zu fixen (sofern grundsätzlich machbar)?

Die FRED hat Unmengen Zahlenmaterial und das wäre schade, wenn man das nicht nutzen kann.

Nicht das ich wüsste, an PP ist ja auch nichts kaputt. Kaputt ist eher was die stlouisfed da liefert.

Ok, danke für die Info!

Hab ja auch nicht behauptet, das was kaputt ist!
Gedanke war nur, dass PP möglicherweise die Daten ( “.” ) rausfiltern / in NA ändern könnte.

Perfekt wäre natürlich ein eigener importer zum auswählen für die Fred. Da die doch sehr viele Daten haben wäre das schon Prima.

Vorallem sind das nur die US Feiertage die Probleme machen.
Und genügen Lösungsansätze gibts hier berreits. Ich denke das der Aufwand hier relativ gering sein sollte.

1 Like

Den Aufwand kann ich halt überhaupt nicht einschätzen!

Mit Programmieren nix am Hut und dafür immer blöde Ideen, was man machen könnte :joy:

Aber nachdem ja nun wohl feststeht, dass es ein Feiertagsproblem ist…

Wir haben uns beholfen, indem wir Chatgpt gebeten haben, ein PHP Skript zu schreiben, das wir auf unseren Webserver legen können, damit der dann das Parsen/Ersetzen übernimmt. Vielleicht hilft es jemandem, der in derselben Situation ist.

<?php
header("Content-Type: application/json; charset=utf-8");

// Basis-URL der Fed API
$baseUrl = "https://api.stlouisfed.org/fred/series/observations";

// Dein fixer API-Key
$apiKey = "a6c37f5d...4312327b7";

// Alle Query-Parameter übernehmen (z.B. series_id, observation_start, frequency …)
$params = $_GET;

// API-Key immer hinzufügen / überschreiben
$params['api_key'] = $apiKey;

// Dateityp fest auf JSON setzen
$params['file_type'] = "json";

// Query-String bauen
$queryString = http_build_query($params);

// Ziel-URL
$targetUrl = $baseUrl . "?" . $queryString;

// Mit cURL Daten abrufen
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $targetUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "PHP-Proxy/1.0");

$response = curl_exec($ch);
if ($response === false) {
    http_response_code(502);
    echo json_encode(["error" => "could not fetch source", "curl_error" => curl_error($ch)]);
    curl_close($ch);
    exit;
}
curl_close($ch);

// JSON parsen
$data = json_decode($response, true);
if ($data === null) {
    http_response_code(500);
    echo json_encode(["error" => "invalid JSON from source"]);
    exit;
}

// "." ersetzen
function fix($value) {
    if ($value === ".") {
        return null; // oder "n/a", falls PP das bevorzugt
    } elseif (is_array($value)) {
        return array_map('fix', $value);
    }
    return $value;
}
$data = fix($data);

// JSON zurückgeben
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

Ihr müsst im Skript oben nur Euren api_key einmalig richtig (er)setzen.

Wenn die PHP Datei auf Eurem Server (“deinserver”) den Namen fred.php hat, erfolgt der Aufruf dann in Portfolio Performance im Feld Kurs-URL via:

https://deinserver/fred.php?series_id=TERMCBCCALLNS

oder auch:

https://deinserver/fred.php?series_id=TERMCBCCALLNS&observation_start=2015-01-01&frequency=monthly

2 Likes

“Einstellen” im engeren Sinne nicht…

Aber ich kann “.” (Punkt) in die Liste der zu ignorierenden Zahlenwerte wie N/A and NaN und null aufnehmen.

Der HTML Importer macht auch stur weiter mit der nächsten Zeile. Das sollte ich auch für den JSON importer ändern.

2 Likes

Vielen Dank für die schnelle Umsetzung an das Programmierer-Team!

Ich konnte es bisher nur auf die Schnelle testen, aber soweit ich das gesehen habe, funktioniert der JSON-Import von der FRED nun problemlos!

Das hilft sehr!

2 Likes