trying to read and process Json file and getting that eror: System.Text.Json.JsonException: 'The JSON value could not be converted to System.Collections.Generic.List`1[ConsoleApp3.match]. Path: $ | LineNumber: 0 | BytePositionInLine: 1.'
What is the problem with the Json file? Would appreciate help
internal class Program
{
static void Main(string[] args)
{
var incoming = new List<match>();
using (StreamReader r = new StreamReader("data.json"))
{
string json = r.ReadToEnd();
incoming = JsonSerializer.Deserialize<List<match>>(json);
}
if (incoming != null && incoming.Count > 0) {
foreach (var score in incoming)
{
Console.WriteLine($"{score.home_name} {score.away_name}");
}
}
Console.ReadLine();
}
}
public class match
{
public int id { get; set; }
public string home_name { get; set; }
public string away_name { get; set; }
public string score { get; set; }
public int time { get; set; }
public int league_id { get; set; }
public string status { get; set; }
}
}
JSON FILE:
"match": [
{
"id": "28172",
"home_name": "Flamengo",
"away_name": "Palestino",
"score": "0 - 1",
"time": "36",
"league_id": "65",
"status": "IN PLAY"
},
{
"id": "28173",
"home_name": "Santa Cruz",
"away_name": "Independiente Medellin",
"score": "2 - 0",
"time": "36",
"league_id": "65",
"status": "IN PLAY"
},
{
"id": "28174",
"home_name": "Union de Sunchales",
"away_name": "Gimnasia y Esgrima de Concepcion",
"score": "0 - 0",
"time": "58",
"league_id": "166",
"status": "IN PLAY"
},
{
"id": "28175",
"home_name": "Corinthians",
"away_name": "Cruzeiro",
"score": "0 - 0",
"time": "34",
"league_id": "128",
"status": "IN PLAY"
},
{
"id": "28176",
"home_name": "Gremio",
"away_name": "Palmeiras",
"score": "1 - 0",
"time": "36",
"league_id": "128",
"status": "IN PLAY"
},
{
"id": "28177",
"home_name": "Real Potosi",
"away_name": "Bolivar",
"score": "2 - 1",
"time": "61",
"league_id": "91",
"status": "IN PLAY"
},
{
"id": "28178",
"home_name": "Blooming",
"away_name": "San Jose",
"score": "3 - 0",
"time": "HT",
"league_id": "91",
"status": "HALF TIME BREAK"
},
{
"id": "28179",
"home_name": "Tachira",
"away_name": "Llaneros Guanare",
"score": "2 - 0",
"time": "84",
"league_id": "66",
"status": "IN PLAY"
},
{
"id": "28180",
"home_name": "DC United",
"away_name": "Columbus Crew",
"score": "2 - 0",
"time": "86",
"league_id": "94",
"status": "IN PLAY"
},
{
"id": "28181",
"home_name": "Montreal Impact",
"away_name": "San Jose Earthquakes",
"score": "2 - 1",
"time": "84",
"league_id": "94",
"status": "IN PLAY"
},
{
"id": "28182",
"home_name": "Toronto FC",
"away_name": "Orlando City",
"score": "0 - 0",
"time": "77",
"league_id": "94",
"status": "IN PLAY"
},
{
"id": "28183",
"home_name": "Carolina RailHawks",
"away_name": "New York Cosmos",
"score": "0 - 2",
"time": "75",
"league_id": "67",
"status": "IN PLAY"
},
{
"id": "28184",
"home_name": "Puerto Rico FC",
"away_name": "Fort Lauderdale Strikers",
"score": "2 - 1",
"time": "83",
"league_id": "67",
"status": "IN PLAY"
},
{
"id": "28186",
"home_name": "Miami FC",
"away_name": "Ottawa Fury",
"score": "1 - 1",
"time": "54",
"league_id": "67",
"status": "IN PLAY"
}
]
}
CodePudding user response:
The JSON you're showing is invalid. Because you missed the first character:
{
This is critical because this JSON represents an object, not an array. But you're trying to deserialize it as an array:
incoming = JsonSerializer.Deserialize<List<match>>(json);
Instead, create a class which matches the object structure:
public class Matches
{
public IEnumerable<Match> match { get; set; }
}
(Also fix the casing on your Match
class to start with a capital letter. Properties should also be capitalized, but that's not necessarily as important as classes and can be addressed another time.)
Then deserialize as that object:
incoming = JsonSerializer.Deserialize<Matches>(json);
CodePudding user response:
you have an object and after this an array, so you can parse your json and after this deserialize an array match to a list
List<match> matches = JsonNode.Parse(json)["match"].Deserialize<List<match>>();
public class match
{
public string id { get; set; }
public string home_name { get; set; }
public string away_name { get; set; }
public string score { get; set; }
public string time { get; set; }
public string league_id { get; set; }
public string status { get; set; }
}