试图反序列化json数组

时间:2018-03-27 19:43:47

标签: c# json serialization

我正在尝试反序列化项目中的本地文件,这是一个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
      }
   },

1 个答案:

答案 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>个对象的集合。