Ich habe den größten Teil von zwei Tagen damit verbracht, mich mit Codebeispielen usw. zu "beschäftigen" und zu versuchen, eine sehr große JSON-Datei in ein Array in c # zu lesen, damit ich sie später zur Verarbeitung in ein 2D-Array aufteilen kann.
Das Problem, das ich hatte, war, dass ich keine Beispiele für Leute finden konnte, die das taten, was ich versuchte. Dies bedeutete, dass ich nur ein wenig Code bearbeitete und auf das Beste hoffte.
Ich habe es geschafft, etwas zum Laufen zu bringen, das:
- Lesen Sie die Datei. Verpassen Sie Header und lesen Sie nur Werte in das Array.
- Platzieren Sie eine bestimmte Anzahl von Werten in jeder Zeile eines Arrays. (Also könnte ich es später aufteilen und in ein 2D-Array aufteilen)
Dies wurde mit dem folgenden Code durchgeführt, stürzt jedoch das Programm ab, nachdem einige Zeilen in das Array eingegeben wurden. Dies hängt möglicherweise mit der Dateigröße zusammen.
// If the file extension was a jave file the following
// load method will be use else it will move on to the
// next else if statement
if (fileExtension == ".json")
{
int count = 0;
int count2 = 0;
int inOrOut = 0;
int nRecords=1;
JsonTextReader reader = new JsonTextReader(new StreamReader(txtLoaction.Text));
string[] rawData = new string[5];
while (reader.Read())
{
if (reader.Value != null)
if (inOrOut == 1)
{
if (count == 6)
{
nRecords++;
Array.Resize(ref rawData, nRecords);
//textBox1.Text += "\r\n";
count = 0;
}
rawData[count2] += reader.Value + ","; //+"\r\n"
inOrOut = 0;
count++;
if (count2 == 500)
{
MessageBox.Show(rawData[499]);
}
}
else
{
inOrOut = 1;
}
}
}
Ein Ausschnitt aus dem JSON, mit dem ich arbeite, ist:
[
{ "millis": "1000",
"stamp": "1273010254",
"datetime": "2010/5/4 21:57:34",
"light": "333",
"temp": "78.32",
"vcc": "3.54" },
]
Ich brauche die Werte aus diesem JSON. Zum Beispiel brauche ich "3.54", aber ich möchte nicht, dass es das "vcc" druckt.
Ich hoffe, jemand kann mir zeigen, wie man eine JSON-Datei einliest und nur die benötigten Daten extrahiert und in ein Array oder etwas, das ich später in ein Array einfügen kann, einfügt.
quelle
Antworten:
Wie wäre es, wenn Sie mit Json.NET alles einfacher machen ? ?
Sie können die Werte sogar
dynamic
verbünden, ohne dieItem
Klasse zu deklarieren .quelle
json
. Es muss der Inhalt Ihrer Datei sein.StreamReader
sowieso eine haben, ist es besser, direkt aus dem Stream zu deserialisieren, indem SieJsonTextReader
wie in Kann Json.NET zeigen / deserialisieren zu / von einem Stream zeigen? . Dasr.ReadToEnd()
wird nicht benötigt.Dies selbst zu tun ist eine schreckliche Idee. Verwenden Sie Json.NET . Es hat das Problem bereits besser gelöst als die meisten Programmierer, wenn sie monatelang Zeit hätten, daran zu arbeiten. Informationen zu Ihren spezifischen Anforderungen, zum Parsen in Arrays usw. finden Sie in der Dokumentation , insbesondere unter
JsonTextReader
. Grundsätzlich verarbeitet Json.NET JSON-Arrays nativ und analysiert sie in Zeichenfolgen, Ints oder was auch immer der Typ ist, ohne dass Sie dazu aufgefordert werden. Hier ist ein direkter Link zu den grundlegenden Code-Verwendungen für Leser und Schreiber, sodass Sie diese in einem Ersatzfenster öffnen können, während Sie lernen, damit zu arbeiten.Dies ist das Beste: Seien Sie diesmal faul und verwenden Sie eine Bibliothek, um dieses häufig auftretende Problem zu lösen für immer .
quelle
Basierend auf der Lösung von @ LB lautet der (
Object
eher als alsAnonymous
) VB-CodeIch sollte erwähnen, dass dies schnell und nützlich ist, um HTTP-Aufrufinhalte zu erstellen, bei denen der Typ nicht erforderlich ist. Und ich verwende es nicht,
Object
sondernAnonymous
kann esOption Strict On
in Ihrer Visual Studio-Umgebung beibehalten - ich hasse es, das auszuschalten.quelle
quelle
Um den richtigen Weg zu finden, benutze ich
Siehe https://stackoverflow.com/a/32071002/4420355
quelle
Verwenden Sie für die JSON-Analyse die Website http://json2csharp.com/ (am einfachsten), um Ihren JSON in eine C # -Klasse zu konvertieren und Ihren JSON in ein C # -Objekt zu deserialisieren.
Verwenden Sie dann den JavaScriptSerializer (aus System.Web.Script.Serialization), falls Sie keine DLL eines Drittanbieters wie newtonsoft möchten.
Dann können Sie Ihr Objekt mit Items.name oder Items.Url usw. erhalten.
quelle
Dies kann auch folgendermaßen erfolgen:
quelle