【问题标题】:json add new object to existing json file C#json将新对象添加到现有的json文件C#
【发布时间】:2016-01-09 22:20:28
【问题描述】:

我正在尝试自动将新对象添加到现有的 json 文件中。我浏览了整个网络,但只发现添加了数据和东西,而不是整个对象。这就是我要编辑的文件的外观:

[
    {"id":"123","name":"carl"}
]

我想去

[
     {"id":"123","name":"carl"},
     {"id":"1234","name":"carl2"}
]

感谢您的所有回答,但我认为并不是每个人都完全理解我的意思我已经尝试了一些答案,但后来我明白了:

[
    "{\"id\":\"123\",\"name\":\"carl\"}"
]"{\"id\":\"1234\",\"name\":\"carl2\"}"

我想要 [] 之间的任何东西。

【问题讨论】:

  • 反序列化为c#数据类型(或JObject,或dynamic等),向列表中添加新项,然后序列化回字符串?

标签: c# json


【解决方案1】:

如果您使用json.NET,您可以简单地反序列化和序列化 json。

var list = JsonConvert.DeserializeObject<List<Person>>(myJsonString);
list.Add(new Person(1234,"carl2");
var convertedJson = JsonConvert.SerializeObject(list, Formatting.Indented);

【讨论】:

  • 这样真的能维持秩序吗?
  • 好吧,既然 JSON 不保证顺序,那真的没关系。
  • @PRMan JSON 保留数组项的顺序,但不保留字典项的顺序。
  • 如果您的 Json 文件很大,这是一个不错的选择吗?
【解决方案2】:

使用 Json.Net

//load from file
var initialJson = "[{\"id\":\"123\",\"name\":\"carl\"}]";

var array = JArray.Parse(initialJson);

var itemToAdd = new JObject();
itemToAdd["id"] = 1234;
itemToAdd["name"] = "carl2";
array.Add(itemToAdd);

var jsonToOutput = JsonConvert.SerializeObject(array, Formatting.Indented);

//save to file here

使用此方法不需要强类型对象

你可以替换这个位:

//load from file
var initialJson = "[{\"id\":\"123\",\"name\":\"carl\"}]";

var initialJson = File.ReadAllText(@"c:\myjson.json")

从文本文件中加载 json

【讨论】:

    【解决方案3】:

    比序列化/反序列化可能是大文件的性能更好的解决方案是打开 FileStream,在结束前查找 1 个字符,然后序列化并将新对象写入数组,然后写入右括号。看到这个问题C# How to delete last 2 characters from text file and write into the same line at the end my text?,我把代码复制到这里——你已经知道如何序列化你的对象并将其编码为字节。

    using(var fs = new FileStream("file.json")) {    
        fs.Seek(-1,SeekOrigin.End);        
        fs.Write(mySerializedJSONObjAsBytes,0,mySerializedJSONObjAsBytes.Length); // include a leading comma character if required
        fs.Write(squareBracketByte, 0, 1);
        fs.SetLength(fs.Position); //Only needed if new content may be smaller than old
    }
    

    抱歉,我还没有测试过这些,这不是我的想法。专业提示:将 FileStream 包装在 StreamWriter 中,以便可以直接写入字符串。

    【讨论】:

      【解决方案4】:

      你可以创建一个方法:

      public string AddObjectsToJson<T>(string json, List<T> objects)
      {
          List<T> list = JsonConvert.DeserializeObject<List<T>>(json);
          list.AddRange(objects);
          return JsonConvert.SerializeObject(list);
      }
      

      然后像这样使用它:

      string baseJson = "[{\"id\":\"123\",\"name\":\"carl\"}]";
      List<Person> personsToAdd = new List<Person>() { new Person(1234,"carl2") };
      
      string updatedJson = AddObjectsToJson(baseJson, personsToAdd);
      

      【讨论】:

      • 由于您尝试将对象列表添加到列表中,因此您应该使用 AddRange() 而不是 Add()
      【解决方案5】:

      这将是你的一个样本:

      var list = JsonConvert.DeserializeObject<List<Example>>(json);
          Example example = new Example();
          example.name = "Product2";
          example.id="1";
          list.Add(example);
          
          string output = JsonConvert.SerializeObject(list);
          
          public class Example
          {
              public string id {get;set;}
              public string name { get; set; }
              
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-08
        • 2021-11-12
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 2021-07-23
        • 1970-01-01
        相关资源
        最近更新 更多