我正在尝试反序列化项目中的本地文件,这是一个json文件。但是我使用当前代码收到此错误:
"解析值时遇到意外的字符:G。路径'',第0行,第0位和#34;
C#代码
string filepath = Application.StartupPath + @"\city.list.json";
for(int i = 0; i< 40; i++)
{
foreach (string x in File.ReadLines(filepath))
{
if(x.Contains("id") || x.Contains("name"))
{
var data = JsonConvert.DeserializeObject<City.values>(filepath);
//City city = JsonConvert.DeserializeObject<City>(File.ReadAllText(filepath));
//cityList.Add(data.name, data.id);
}
else
{
}
}
}
class City
{
[JsonObject(MemberSerialization = MemberSerialization.OptIn)]
public class values
{
[JsonProperty(PropertyName = "id")]
public string id { get; set; }
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
}
}
Json文件我试图反序列化。这只是从文件中取出的快速示例。它相当大^^
[
{
"id":707860,
"name":"Hurzuf",
"country":"UA",
"coord":{
"lon":34.283333,
"lat":44.549999
}
},
{
"id":519188,
"name":"Novinki",
"country":"RU",
"coord":{
"lon":37.666668,
"lat":55.683334
}
},
答案 0 :(得分:3)
您似乎对JSON反序列化的工作方式存在一些误解。要解决的第一件事是你不应该遍历json文件的行。正如评论中指出的那样,您的JSON文件非常大(约180万行),因此您最好使用JsonReader
的{{1}}重载,请参阅Json.NET performance tips:
DeserializeObject()
请注意这一行:
List<City.values> cities = new List<City.values>();
string filepath = Application.StartupPath + @"\city.list.json";
using (StreamReader sr = new StreamReader(filepath))
using (JsonReader reader = new JsonTextReader(sr))
{
JsonSerializer serializer = new JsonSerializer();
// read the json from a stream
// json size doesn't matter because only a small piece is read at a time from the HTTP request
cities = JsonConvert.DeserializeObject<List<City.values>>(reader);
}
这里我们利用JSON.NET进行反序列化。您的代码与我在此处包含的代码之间的区别在于您的JSON是对象的集合,这意味着您需要反序列化为{{{>>的集合 1}}对象,在这种情况下,我使用了cities = JsonConvert.DeserializeObject<List<City.values>>(reader);
。
现在我们有一个变量City.values
,它是JSON中包含的List<T>
个对象的集合。