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



## Cellsplitter (13. Sep 2021)

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:


```
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:

```
{
  "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:


```
{
  "'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


----------



## Oneixee5 (13. Sep 2021)

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.








						JSON.stringify() - JavaScript | MDN
					

The JSON.stringify() static method converts a JavaScript value to a JSON string, optionally replacing values if a replacer function is specified or optionally including only the specified properties if a replacer array is specified.




					developer.mozilla.org


----------



## krgewb (13. Sep 2021)

Das verstößt gegen die Notation.


----------



## krgewb (13. Sep 2021)

Du musst den String selbst zusammenbauen lassen. 

```
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".


----------



## Cellsplitter (13. Sep 2021)

krgewb hat gesagt.:


> Du musst den String selbst zusammenbauen lassen.
> 
> ```
> String s = "";
> ...


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.


----------



## thecain (13. Sep 2021)

krgewb hat gesagt.:


> Du musst den String selbst zusammenbauen lassen.
> 
> ```
> String s = "";
> ...


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.


----------



## Thallius (13. Sep 2021)

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]


----------



## mrBrown (13. Sep 2021)

Damit wenigstens noch ein funktionierender Ansatz gezeigt wird 


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


----------



## Flown (13. Sep 2021)

Warum nicht ein simples `map`?


----------



## mrBrown (13. Sep 2021)

Flown hat gesagt.:


> Warum nicht ein simples `map`?


In @Thallius Code wär's besser – aber der TO will ja gar kein Array als Ergebnis


----------



## M.L. (16. Sep 2021)

Doppelpostings (vor allem solche ohne Hinweis und ohne zwischenzeitlich erfolgte eigene Ansätze) sind übrigens unhöflich: https://entwickler-forum.de/forum/w...-ergebnis-umbauen-und-in-json-datei-speichern


----------

