Api auslesen und in Json Datei speichen - Javascript (node js)

Cellsplitter

Neues Mitglied
Hallo, ich brauch mal eure Hilfe und zwar möchte ich den Inhalt einer API in einer json Datei speichern, das klappt auch soweit super, doch ist mir der Inhalt der Json Datei zu viel.

Api auslesen und in Json speichen via fs.writeFileSync:

Javascript:
function getPriceList() {
    request(priceUrl, (error, response, body) => {
        if (error || response.statusCode !== 200) return console.log(`Error: ${error} - Status Code: ${response.statusCode}`);
        //console.log("DEBUG: " + body);
        fs.writeFileSync("prices.json", JSON.stringify(JSON.parse(body), null, 2));
      
    });
}

getPriceList();

Snippet aus der erzeugten prices.json Datei:
Javascript:
{
  "status": "success",
  "prices": [
    {
      "app_id": "730",
      "context_id": "2",
      "market_hash_name": "'Blueberries' Buckshot | NSWC SEAL",
      "price": "1.71",
      "pricing_mode": "market",
      "skewness": "-0.49",
      "created_at": 1631410301,
      "icon_url": null,
      "name_color": null,
      "quality_color": null,
      "rarity_color": null,
      "instant_sale_price": null
    },
    {
      "app_id": "730",
      "context_id": "2",
      "market_hash_name": "'The Doctor' Romanov | Sabre",
      "price": "3.06",
      "pricing_mode": "market",
      "skewness": "-0.05",
      "created_at": 1631419491,
      "icon_url": null,
      "name_color": null,
      "quality_color": null,
      "rarity_color": null,
      "instant_sale_price": "1.22"
    },
    {
      "app_id": "730",
      "context_id": "2",
      "market_hash_name": "'Two Times' McCoy | TACP Cavalry",
      "price": "1.23",
      "pricing_mode": "market",
      "skewness": "-0.11",
      "created_at": 1631407484,
      "icon_url": null,
      "name_color": null,
      "quality_color": null,
      "rarity_color": null,
      "instant_sale_price": null
    }
  ]
}

Dies Ausgabe ist mir zu viel. Wie bekomme ich es hin, das die json Datei nur noch folgendes beinhaltet:

Javascript:
{
  "'Blueberries' Buckshot | NSWC SEAL": 1.71,
  "'The Doctor' Romanov | Sabre": 3.06,
  "'Two Times' McCoy | TACP Cavalry": 1.23
}

Also quasi nur noch alle

"market_hash_name": price

In diesem Format in der json speichert?

MfG
 
Man kann einfach ein neues JS-Object erstellen und die gewünschten Eigenschaften aus body in das neue Objekt übertragen. Eine andere Möglichkeit wäre, hier: JSON.stringify(JSON.parse(body), null, 2) statt für den replacer null zu verwenden eine replacer-Funktion einzusetzen.
 
Du musst den String selbst zusammenbauen lassen.
Java:
String s = "";
s += "{";
for (int i = 0; i < bla.size(); i++) {
  Double price = Double.parseDouble(bla.get(i).getPrice());
  s += "\"" + bla.get(i).getMarketHashName() +  "\": " + price;
  if(i < bla.size() - 1) {
    s += ",";
  }
}
s += "}";

Automatisch wirst du es nämlich nicht schaffen. Dazu bräuchtest du eine Klasse mit den ganzen Variablen. Eine Variable hieße dann blueberriesBuckshotNSWCSEAL und die Annotation "'Blueberries' Buckshot | NSWC SEAL".
 
Du musst den String selbst zusammenbauen lassen.
Java:
String s = "";
s += "{";
for (int i = 0; i < bla.size(); i++) {
  Double price = Double.parseDouble(bla.get(i).getPrice());
  s += "\"" + bla.get(i).getMarketHashName() +  "\": " + price;
  if(i < bla.size() - 1) {
    s += ",";
  }
}
s += "}";

Automatisch wirst du es nämlich nicht schaffen. Dazu bräuchtest du eine Klasse mit den ganzen Variablen. Eine Variable hieße dann blueberriesBuckshotNSWCSEAL und die Annotation "'Blueberries' Buckshot | NSWC SEAL".
Vielen Dank für die schnelle Antwort, beim überfliegen sieht der Ansatz einleuchtend aus, bin nur leider blutiger Anfänger was JS angeht und weiß nicht so recht wie ich das nun in mein Code einbauen muss, hab es eben probiert aber bin leider gescheitert.
 
Du musst den String selbst zusammenbauen lassen.
Java:
String s = "";
s += "{";
for (int i = 0; i < bla.size(); i++) {
  Double price = Double.parseDouble(bla.get(i).getPrice());
  s += "\"" + bla.get(i).getMarketHashName() +  "\": " + price;
  if(i < bla.size() - 1) {
    s += ",";
  }
}
s += "}";

Automatisch wirst du es nämlich nicht schaffen. Dazu bräuchtest du eine Klasse mit den ganzen Variablen. Eine Variable hieße dann blueberriesBuckshotNSWCSEAL und die Annotation "'Blueberries' Buckshot | NSWC SEAL".
Nein, das ist quatsch.

1. Der TE arbeitet mit Javascript nicht Java
2. Auch in Java wäre deine Lösung nicht gut. Die Namen kann man in allen namhaften Json Libraries per Annotation o.ä. konfigurieren.

Der Ansatz von @Oneixee5 müsste passen.
 
Nein da würde dann ja auch nicht aus dem marketing Namen ein Key mit dem price als Value.

Ich denke das geht nur über selbst geschriebenen Code

[CODE lang="java" title="Create New Array"]
const oldArray = JSON.parse(jsonfile);
let newArray = [];
oldArray.prices.forEach((element) => newArray.push({ element.market_hash_name : element.price }));
[/CODE]
 
Damit wenigstens noch ein funktionierender Ansatz gezeigt wird 😉

Javascript:
JSON.parse(body)
  .prices
  .reduce((agg,price) => {
      agg[price.market_hash_name]=Number(price.price);
      return agg
    }, {})
 

Zurück
Oben