首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将多行JSON反序列化为C#对象

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

Stack Overflow用户
提问于 2019-11-26 03:32:44
回答 3查看 2.8K关注 0票数 1
代码语言:javascript
运行
复制
 {"ItemName":"8","Id":1}
 {"ItemName":"9","Id":2}

我从blob读取json文件,每一行都有上面的格式,行甚至不被逗号分隔,文件中也没有方括号。

当我尝试在jsontextreader中设置SupportMultipleContent true时,我会得到以下异常:

代码语言:javascript
运行
复制
 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格式。

代码:

代码语言:javascript
运行
复制
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没有显式字符

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-26 04:25:29

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

要读取它,只需重写您的方法就可以单独地反序列化每一行:

代码语言:javascript
运行
复制
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;
}

在网上试试

票数 4
EN

Stack Overflow用户

发布于 2019-11-26 13:25:45

下面的代码在我的机器上工作。我正在使用Newtonsoft.Json版本的12.0.3针对netcoreapp3.0

代码语言:javascript
运行
复制
using System;
using System.Collections.Generic;
using System.IO;
using Newtonsoft.Json;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string json = @"
{'ItemName':'8','Id':1}
{'ItemName':'9','Id':2}
";

            var items = new List<Item>();

            var serializer = new JsonSerializer();

            using (var sr = new StringReader(json))
            {
                using (var jsonTextReader = new JsonTextReader(sr))
                {
                    jsonTextReader.SupportMultipleContent = true;
                    while (jsonTextReader.Read())
                    {
                        var data = serializer.Deserialize<Item>(jsonTextReader);
                        items.Add(data);
                    }

                }
            }

            foreach (Item item in items)
            {
                Console.WriteLine($"{item.Id}: {item.ItemName}");
            }
        }
    }

    public class Item
    {
        public string ItemName { get; set; }
        public int Id { get; set; }
    }
}
票数 4
EN

Stack Overflow用户

发布于 2019-11-26 09:35:29

请使用method转换反序列化方法。

代码语言:javascript
运行
复制
 List<object> myDeserializedObjList = (List<object>)Newtonsoft.Json.JsonConvert.DeserializeObject(responseContent, typeof(List<object>));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59043359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档