2013-12-17 15 views
5

Tôi đang làm việc trên tệp để thêm/truy xuất dữ liệu. Định dạng dữ liệu là JSON. Tôi là một người mới. Tôi đang sử dụng JSON.NET để tuần tự hóa và deserialize dữ liệu. đây là định dạng jsonCách thêm tệp json mà không làm phiền định dạng

{ 
    "EmpId": 1, 
    "Name": "Kaushik", 
    "Designation": ".net Developer", 
    "JoiningDate": "09/23/2013", 
    "Skill": [ 
    { 
     "Id": 1, 
     "SkillName": "C#" 
    }, 
    { 
     "Id": 2, 
     "SkillName": "PHP" 
    }, 
    { 
     "Id": 3, 
     "SkillName": "java" 
    } 
    ] 
}

Đây là định dạng JSON tôi đang làm việc. Mô tả sự cố

  1. Tôi muốn thêm dữ liệu tệp để tôi có thể thêm nhiều json vào điều này, vì vậy tôi cần kiểm tra xem đã có một số dữ liệu chưa?
  2. và thứ hai tôi muốn nối thêm dữ liệu trong tệp json theo hình thức nối dữ liệu sẽ trông giống như
[ 
    { 
     "EmpId": 1, 
     "Name": "Kaushik", 
     "Designation": ".net Developer", 
     "JoiningDate": "09/23/2013", 
     "Skill": [ 
      { 
       "Id": 1, 
       "SkillName": "C#" 
      }, 
      { 
       "Id": 2, 
       "SkillName": "PHP" 
      }, 
      { 
       "Id": 3, 
       "SkillName": "java" 
      } 
     ] 
    }, 
    { 
     "EmpId": 1, 
     "Name": "Kaushik", 
     "Designation": ".net Developer", 
     "JoiningDate": "09/23/2013", 
     "Skill": [ 
      { 
       "Id": 1, 
       "SkillName": "C#" 
      }, 
      { 
       "Id": 2, 
       "SkillName": "PHP" 
      }, 
      { 
       "Id": 3, 
       "SkillName": "java" 
      } 
     ] 
    } ]

vấn đề Vì vậy, chính điều này là tôi không nhận được logic chính xác để thêm các tập tin.

Tôi đang đọc file char bởi char như sau

 

    int count = 0; 
       EmployeeDetail employee = new EmployeeDetail 
       { 

        EmpId = ++count, 
        Name = formCollection["Name"], 
        Designation = formCollection["Designation"], 
        JoiningDate = formCollection["JoiningDate"], 
        Skill = new List 
        { 
         new Skills(){Id = 1, SkillName = "C#"}, 
         new Skills(){Id = 2, SkillName = "PHP"}, 
         new Skills(){Id = 3, SkillName = "java"} 
        } 

       }; 

       string json = JsonConvert.SerializeObject(employee,Formatting.Indented); 
       var dataFile = Server.MapPath("~/App_Data/json_data.json"); 
       //Reading the file 
       StreamReader reader = new StreamReader(dataFile); 
       int Tchar = 0; 
       char ch; 
       do 
       { 
        ch = (char)reader.Read(); 

        Response.Write(ch); 
        Tchar++; 
       } while (!reader.EndOfStream); 
       reader.Close(); 

       StreamWriter file = new StreamWriter(dataFile,append:true); 

       file.WriteLine(json); 

       file.Close(); 

vì vậy bất kỳ help is appreciated cảm ơn

Trả lời

10

Cách tiếp cận tốt nhất và đáng tin cậy nhất của bạn sẽ không được thêm vào tệp, mà thay vào đó, đọc toàn bộ tệp JSON và hủy tuần tự hóa đối tượng, thêm vào bộ sưu tập đối tượng và sau đó sắp xếp lại đầu ra trở lại tệp JSON .

Tôi tạo ra mẫu này cho bạn (đường dẫn thay đổi và lớp cho phù hợp):

var filePath = @"C:\Users\grahamo\Documents\Visual Studio 2013\Projects\WebApplication1\WebApplication1\bin\path.json"; 
// Read existing json data 
var jsonData = System.IO.File.ReadAllText(filePath); 
// De-serialize to object or create new list 
var employeeList = JsonConvert.DeserializeObject<List<EmployeeDetail>>(jsonData) 
         ?? new List<EmployeeDetail>(); 

// Add any new employees 
employeeList.Add(new EmployeeDetail() 
{ 
    Name = "Test Person 1" 
}); 
employeeList.Add(new EmployeeDetail() 
{ 
    Name = "Test Person 2" 
}); 

// Update json data string 
jsonData = JsonConvert.SerializeObject(employeeList); 
System.IO.File.WriteAllText(filePath, jsonData); 

Như bạn là người mới, up-phiếu hoặc đánh dấu là câu trả lời nếu tôi đã giúp bạn ra ngoài.

+0

Cảm ơn Trước tiên vì sự giúp đỡ của bạn. Dấu 'nghĩa là gì? và Nội dung tập tin vào lần thứ hai là gì? Nó sẽ là mảng của cả hai json hay không ?? Bởi vì tôi không nhận được giải pháp của bạn chính xác –

+0

'??' có nghĩa là nếu hàm DeserializeObject trả về null (có nghĩa là tập tin chưa được tạo, hoặc trống) thì chỉ cần tạo một Danh sách EmployeeDetail mới. Nội dung tập tin ở vòng thứ hai sẽ tiết kiệm 4 nhân viên. Sau đó 6 nhân viên vv ...Bạn có thể chỉ muốn một nhân viên thêm mỗi lần, vì vậy chỉ cần thay đổi nó. – GONeale

+0

Cảm ơn bạn rất nhiều –

1

Có một phương pháp CopyTo trên FileStream. Vì vậy, bạn không cần đọc char-by-char, hãy mở luồng tệp và CopyTo vào luồng phản hồi. Ngoài ra tôi khuyên bạn nên reserialize các tập tin đầu tiên (sử dụng Json.NET, bạn chỉ có thể sử dụng dynamic để tránh rối với các loại bê tông), và vì nó là một mảng các đối tượng, sau đó thêm đối tượng mới của bạn vào mảng này và lưu lại.

Định dạng sẽ luôn chính xác vì bạn lưu lại toàn bộ tệp.

P.S. Bạn có thể sẽ không thể chỉ chắp thêm vì đối tượng JSON được tuần tự hóa trong tệp là "đã đóng" (bạn có } ] ở đó), vì vậy việc thêm văn bản sẽ không hoạt động.

+0

Tôi đã duy trì tệp dưới dạng cơ sở dữ liệu, mỗi khi người dùng nhập một bản ghi tôi đã lưu để lưu và hiển thị trang chủ chính. Vì vậy, tôi cần phải nối thêm dữ liệu. Bạn có thể vui lòng xây dựng câu trả lời của bạn ít hơn, tôi mới đến C# vì vậy tôi không nhận được rằng những gì chính xác bạn có ý nghĩa? –

Các vấn đề liên quan