【问题标题】:Read multiple json objects from a json file [duplicate]从一个json文件中读取多个json对象[重复]
【发布时间】:2014-10-30 05:15:10
【问题描述】:

我有一个包含多个 json 对象的文件。如何在 .net 中阅读此文件

我需要以下字符串作为两个 json 对象

“{你好:'那里'} {再见:'你',谢谢:'你'}”

【问题讨论】:

  • 父对象在哪里?
  • 没有父对象,因为它们是单个文件中的两个json对象。这个json文件是从系统生成的。文件包含两个或多个json对象。我们必须读取并保存它在 sql server 数据库中
  • 但是您不能单独访问对象,要么将这些 json 放入数组中,要么放入 json 对象中,如 [{hello:'there'},{goodbye:'you',Thanks:'you'} ] 或 {"hello":{hello:'there'},"greetings":{goodbye:'you',Thanks:'you'}}

标签: asp.net json json.net


【解决方案1】:

@Anu:首先,我不认为你指定的字符串 "{hello:'there'} {goodbye:'you',Thanks:'you'}" 是正确的 Json 字符串。

应该是这样才能正确反序列化 {"Arrival":{"Hello":"there"},"Departure":{"GoodBye":"you","Thanks":"you"}}

请看下面的示例以了解正确的结构:

//需要安装Json.Net并使用如下图:

    using Newtonsoft.Json;

//序列化和反序列化的对象:

public class Greeting
{

    public Arrival Arrival { get; set; }
    public Departure Departure { get; set; }
}

public class Arrival
{
    public string Hello { get; set; }

}

public class Departure
{
    public string GoodBye { get; set; }
    public string Thanks { get; set; }

}

//填充Getting Object C#方式

var greeting = new Greeting
                {
                    Arrival = new Arrival { Hello = "there" },
                    Departure = new Departure { GoodBye = "you", Thanks = "you" }
                };

//将C#对象序列化为Json

var jsonString = JsonConvert.SerializeObject(new
        {
                Arrival = new
                {
                    greeting.Arrival.Hello
                },
                Departure = new { greeting.Departure.GoodBye, greeting.Departure.Thanks }
            });

//产生这个Json字符串:{"Arrival":{"Hello":"there"},"Departure":{"GoodBye":"you","Thanks":"you"} }

//将Json字符串转回C#对象——反序列化​​对象

    var greeting1 = (Greeting)JsonConvert.DeserializeObject(jsonString, typeof(Greeting));

希望这有助于并回答您的问题。

祝你好运!

【讨论】:

  • 非常感谢您的回答。我无法创建一个类型化的类,因为 json 内容并不总是相同。我的要求是从单个文件中读取多个 json 内容。从这个 url newtonsoft.com/json/help/index.html?topic=html/… ,提到可以读取多个 json 片段跨度>
  • 如果是这样,那么您可以从 Brian Rogers 提供的链接中获得答案。看一看,它只是解释了你在寻找什么。祝你好运!
  • 谢谢所有..Brian Rogers 是真的。
【解决方案2】:

Dibu 是正确的 - 您的字符串不是有效的 JSON 对象,因此您不能将其自动反序列化回对象。

您应该编写自己的解析器(哎呀,不要这样做)或强制将源输入文件更改为以下之一:

  1. 包含一个有效的 JSON 对象(由多个单独的对象组成),因此您可以轻松地对其进行反序列化
  2. 在各个对象之间包含一些分隔符,因此您可以手动拆分源字符串并逐个反序列化对象。

最好的选择是将源文件更改为包含一个有效对象,但我想这不是您对这种源文件格式的决定...

【讨论】:

    【解决方案3】:

    有办法。反序列化时需要一个 JsonConverter 才能通过。

    string json = @"{hello:'there'} {goodbye:'you',Thanks:'you'}";
    
    IList<Greeting> greetings= new List<Greeting>();
    JsonTextReader reader = new JsonTextReader(new StringReader(json));
    // this is the important part, which makes the reader not throw exception
    //when one json object is finished
    reader.SupportMultipleContent = true;
    while (true)
    {
        if (!reader.Read())
        {
            break;
        }
    
        JsonSerializer serializer = new JsonSerializer();
        Greeting greeting= serializer.Deserialize<Greeting>(reader);
    
        greetings.Add(greeting);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 2019-05-26
      • 1970-01-01
      • 2015-03-10
      • 2020-12-25
      • 2016-08-18
      相关资源
      最近更新 更多