如何修复“无法将当前JSON数组反序列化为类型为“ passages”,因为需要JSON对象(例如{“ name”:“ value”})来反序列化

时间:2019-09-28 07:02:29

标签: c# json lucene.net

我正在尝试使用C#中的newtonsoft.json从本地目录读取和访问大型JSON文件,但始终给我错误。我创建了两个类来访问它。 这是我的示例JSON数据:

{
    "passages": [
        {
            "passage_text": "xxxxxxx",
            "url": "xxxxx",
        }
    ]
    "answer":"xxxxxx",
    "query_id":"Xxxxx"
}

这是我尝试过的代码:

public class collection
{
    public passages passages { get; set; }
    public String answers { get; set; }
    public String query_id { get; set; }
}

public class passages
{
    public String url { get; set; }
    public String passage_text { get; set; }
}

这是我尝试读取和访问JSON文件的部分:

String jsonPath = @"C:\Users\admin\Desktop\647\project\collection\sample_collection.json"  ;
var serializer = new JsonSerializer();
StreamReader sr = new StreamReader(jsonPath);
JsonTextReader reader = new JsonTextReader(sr);
reader.SupportMultipleContent = true;
while (reader.Read())
{
    if (reader.TokenType == JsonToken.StartObject)
    {
        collection c = serializer.Deserialize<collection>(reader);
        Console.WriteLine(c.passages.url);
     }
}

它给了我这个错误:

  

Newtonsoft.Json.JsonSerializationException:'无法将当前JSON数组(例如[1,2,3])反序列化为类型'LuceneIndexApplication.passages',因为该类型需要JSON对象(例如{“ name”:“ value” })正确反序列化。   要解决此错误,可以将JSON更改为JSON对象(例如{“ name”:“ value”}),也可以将反序列化类型更改为数组,或者将实现集合接口的类型(例如ICollection,IList)更改为List,例如List从JSON数组反序列化。还可以将JsonArrayAttribute添加到类型中,以强制其从JSON数组反序列化。   路径'[0] .passages',第1行,位置15。'

1 个答案:

答案 0 :(得分:2)

您正在尝试将段落从数组映射到列表。

因此您需要更改的只是:

public class collection
    {
        public passages passages { get; set; }
        public String answers { get; set; }
        public String query_id { get; set; }
    }

应该是

public class collection
    {
        public List<passages> passages { get; set; }
        public String answers { get; set; }
        public String query_id { get; set; }
    }

请注意后者中的列表。