将多行JSON反序列化为C#对象

时间:2019-11-26 03:32:44

标签: c# .net json .net-core azure-data-factory-2

 {"ItemName":"8","Id":1}
 {"ItemName":"9","Id":2}

我正在从blob中读取json文件,每行具有上述格式,并且行甚至没有被逗号分隔,而且文件中也没有方括号。

当我尝试在jsontextreader中将SupportMultipleContent设置为true时,出现以下异常:

 Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[ValueDTO]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path 'ItemName', line 1, position 12.

或者,如果无法解析此类json,那么我将如何在Azure中配置数据工厂以使文件采用正确的json格式。

代码:

using (var sr = new StreamReader(stream))
{
    using (var jsonTextReader = new JsonTextReader(sr))
    {
        jsonTextReader.SupportMultipleContent = true;
        while (jsonTextReader.Read())
        {
            var data = serializer.Deserialize<T>(jsonTextReader);
            result.Add(data);
        }

    }
}
  

Json没有明确的\ n字符

3 个答案:

答案 0 :(得分:3)

JSON的每一行本身就是一个JSON对象。您没有包含所有对象的JSON数组。

要阅读它,您只需要重写方法以分别反序列化每行:

private static List<ValueDTO> LoadItems(Stream stream)
{
    var result = new List<ValueDTO>();
    using (var reader = new StreamReader(stream))
    {
        string line = null;
        while ((line = reader.ReadLine()) != null)
        {
            if (!string.IsNullOrEmpty(line))
            {
                result.Add(JsonConvert.DeserializeObject<ValueDTO>(line));
            }
        }
    }
    return result;
}

Try it online

答案 1 :(得分:3)

以下代码可在我的计算机上使用。我使用的是Newtonsoft.Json的{​​{1}}版本12.0.3

netcoreapp3.0

答案 2 :(得分:1)

请使用Jsonconvert反序列化方法。

 List<object> myDeserializedObjList = (List<object>)Newtonsoft.Json.JsonConvert.DeserializeObject(responseContent, typeof(List<object>));