代码之家  ›  专栏  ›  技术社区  ›  Alexander

如何插入json文件而不删除以前的数据?

  •  2
  • Alexander  · 技术社区  · 7 年前

    我正在将数据插入 .json 文件。我的插入工作正常,但我有一个问题-当我插入新数据时,文件中以前的数据会被删除。 我还需要它的格式为,因为我需要查询它:

    [
      {
        "Rollnumber": 3,
        "StudentName": "Tapas"
      },
      {
        "Rollnumber": 4,
        "StudentName": "Papas"
      }
    ]
    

    当我将数据作为list.ToArray()传递时(在代码示例中,这将是\u数据),我得到了[]方括号,但仅在rollnumber=3的第一个数据上。 这是我目前的代码:

    private void AddStudent()
    {
        Student objStudent = new Student();
        objStudent.Rollnumber = 3;
        objStudent.StudentName = "Tapas";
    
    
        /*  List<Student> _data = new List<Student>();
        _data.Add(new Student()
        {
            Rollnumber = 4,
            StudentName = "Papas"
        });
        */
    
        string jsonData = JsonConvert.SerializeObject(objStudent, Formatting.Indented);
        System.IO.File.WriteAllText(jsonFileS, jsonData);
    }
    

    我试过了 StreamWritter 还有,但我做不到。

    4 回复  |  直到 7 年前
        1
  •  2
  •   Ashiq Hassan    7 年前
    1. 检索包含JSON的源文件。
    2. 从源文件读取文本内容(JSON数据)。
    3. 将JSON数据反序列化到学生对象列表。
    4. 序列化学生列表,您将从该方法返回JSON数据字符串。

    下面是示例代码:

    var file = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
    var jsonString = await FileIO.ReadTextAsync(file);
    var studentList = JsonConvert.DeserializeObject<List<Student>>(jsonString);
    var newStudent = new Student();
    newStudent.Rollnumber = 2;
    newStudent.StudentName = "Abcd";
    studentList.Add(newStudent);
    var updatedJsonString = JsonConvert.SerializeObject(studentList);
    await FileIO.WriteTextAsync(file, updatedJsonString);
    
        2
  •  1
  •   Phạm Thế Hùng    7 年前

    1、从文件中读取数据

    StreamReader sw = new StreamReader(fileName);
    string res = sw.ReadToEnd();
    

    2.删除“res”(res变量)的“]”,并用您的格式添加新的Json字符串(删除“[”和add“,”)。

    所以你的琴弦看起来就像两个琴弦加在一起

    [
      {
        "Rollnumber": 3,
        "StudentName": "Tapas"
      }
    // Cut the last "]"
    

    // cut the first "[" and add ","
          ,
          {
            "Rollnumber": 4,
            "StudentName": "Papas"
          }
        ]
    

    因此,它将成为你在决赛中想要的:

    [
      {
        "Rollnumber": 3,
        "StudentName": "Tapas"
      },
      {
        "Rollnumber": 4,
        "StudentName": "Papas"
      }
    ]   
    
        3
  •  1
  •   Alexander    7 年前

    append to a json file

       var jsonData = System.IO.File.ReadAllText(jsonFile);
            // De-serialize to object or create new list
            var employeeList = JsonConvert.DeserializeObject<List<Student>>(jsonData)
                                  ?? new List<Student>();
    
            // Add any new employees
            employeeList.Add(new Student()
            {
                Rollnumber = 1,
                StudentName = "Paja1",
                Subject = new Subject
                {
                    Id = 1,
                    Name = "Sub1"
                }
            });
            employeeList.Add(new Student()
            {
                Rollnumber = 1,
                StudentName = "Pera1",
                Subject = new Subject
                {
                    Id = 1,
                    Name = "Sub1"
                }
            });
    
            // Update json data string
            jsonData = JsonConvert.SerializeObject(employeeList,Formatting.Indented);
            System.IO.File.WriteAllText(jsonFile, jsonData);
    
        4
  •  1
  •   CodingYoshi    7 年前

    正如我在对您的问题的评论中提到的,您需要加载整个文件,反序列化它,然后在内存中向其中添加项。完成后,通过序列化重写文件。

    如果不想将整个文件加载到内存中,则手动处理该文件,方法是操作序列化字符串,然后附加到文件中;否则,文件中的JSON就会出错。

    以下是反序列化整个文件的第一个方法:

    public static class Program
    {
        public static void Main()
        {
            var rolls = LoadRolls();
    
            // Once the contents of the file are in memory you can also manipulate them         
            Roll firstRoll = rolls.SingleOrDefault(x => x.Rollnumber == 1);
            if (firstRoll != null)
            {
                firstRoll.StudentName = "Jerry";
            }
    
            // Let's just add a few records. 
            rolls.AddRange(
                new List<Roll>{
                    new Roll { Rollnumber = 1, StudentName = "Elaine" },
                    new Roll { Rollnumber = 2, StudentName = "George" }
                });
    
            string json = JsonConvert.SerializeObject(rolls, Newtonsoft.Json.Formatting.Indented);
    
            File.WriteAllText("Rolls.txt", json);
    
            Console.Read();
        }
    
        private static List<Roll> LoadRolls()
        {
            List<Roll> rolls = JsonConvert.DeserializeObject<List<Roll>>(File.ReadAllText("Rolls.txt"));
    
            return rolls ?? new List<Roll>();
        }
    }
    
    public class Roll
    {
        public int Rollnumber { get; set; }
        public string StudentName { get; set; }
    }