2013-08-30 34 views
22

Tôi mới sử dụng các đối tượng C# và json và tôi đang cố di chuyển trang web của mình từ tệp cấu hình dựa trên xml sang tệp json. Có cách nào để tải trong một tập tin .json để nó biến thành đối tượng? Tôi đã tìm kiếm trên web và tôi không thể tìm thấy một trang web. Tôi đã có tệp xml được chuyển đổi và lưu dưới dạng .json. Tôi không muốn sử dụng thư viện của bên thứ ba.Đang tải tập tin .json vào chương trình C#

+0

Có thể trùng lặp? Xem http://stackoverflow.com/questions/4521239/deserializing-json-using-c-sharp – SolarBear

+6

'Tôi đã tìm kiếm trên web và tôi không thể tìm thấy một thứ khó tin ... – I4V

+0

đủ công bằng, tôi đã tìm thấy một số công cụ tương tự này nhưng tôi đã thử các giải pháp của họ và nó không hoạt động. Thực hiện một số tiến trình ngay bây giờ –

Trả lời

48

Bạn thực sự nên sử dụng một thư viện thành lập, chẳng hạn như Newtonsoft.Json (mà thậm chí Microsoft sử dụng cho các khuôn khổ như MVC và WebAPI), hoặc NET tích hợp trong JavascriptSerializer.

Dưới đây là một ví dụ của việc đọc JSON sử dụng Newtonsoft.Json:

JObject o1 = JObject.Parse(File.ReadAllText(@"c:\videogames.json")); 

// read JSON directly from a file 
using (StreamReader file = File.OpenText(@"c:\videogames.json")) 
using (JsonTextReader reader = new JsonTextReader(file)) 
{ 
    JObject o2 = (JObject) JToken.ReadFrom(reader); 
} 
+1

Vâng ... obviuosly OP không nên * viết của riêng mình *. Nhưng nếu anh ta muốn một lớp khung công tác thực hiện chức năng này, ['JavaScriptSerializer'] (http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx) sẽ hoạt động. –

+0

Tôi đã tải xuống NewtonSoft nhưng không muốn ai đó la mắng tôi vì sử dụng thư viện bên ngoài –

+0

@inquisitiveIdiot Tôi hiểu lầm và nghĩ rằng bạn định viết thư của riêng mình. Việc xây dựng trong JavascriptSerializer là phong nha cho hầu hết các trường hợp sử dụng, nhưng Newtonsoft là rất nhanh và đầy đủ tính năng. – STW

1

Xem Microsofts JavaScriptSerializer

Lớp JavaScriptSerializer được sử dụng trong nội bộ bằng cách không đồng bộ lớp thông tin liên lạc để serialize và deserialize dữ liệu mà là được chuyển giữa trình duyệt và máy chủ Web. Bạn không thể truy cập vào phiên bản của trình nối tiếp. Tuy nhiên, lớp này hiển thị API công khai. Vì vậy, bạn có thể sử dụng lớp khi bạn muốn làm việc với JavaScript Ký hiệu đối tượng (JSON) trong mã được quản lý.

Namespace: System.Web.Script.Serialization

hội: System.Web.Extensions (trong System.Web.Extensions.dll)

+0

JSON (trái với niềm tin phổ biến) * không * một tập hợp con của Javascript, xem ví dụ https://medium.com/joys-of-javascript/json-js-42a28471221d – Nubok

4

Như đã đề cập trong câu trả lời khác Tôi sẽ khuyên bạn nên sử dụng json.NET. Bạn có thể tải xuống gói bằng NuGet. Sau đó, để deserialize các tập tin json của bạn vào các đối tượng C# bạn có thể làm một cái gì đó như;

JsonSerializer serializer = new JsonSerializer(); 
    MyObject obj = serializer.Deserialize<MyObject>(File.ReadAllText(@".\path\to\json\config\file.json"); 

Đoạn mã trên giả định rằng bạn có một cái gì đó giống như

public class MyObject 
{ 
    public string prop1 { get; set; }; 
    public string prop2 { get; set; }; 
} 

Và json bạn trông như thế;

{ 
     "prop1":"value1", 
     "prop2":"value2" 
} 

Tôi thích sử dụng phương pháp deserialize chung hơn sẽ deserialize json vào đối tượng giả định rằng bạn cung cấp cho nó loại có định nghĩa phù hợp với json's. Nếu có sự khác biệt giữa hai nó có thể ném, hoặc không đặt giá trị, hoặc chỉ bỏ qua những thứ trong json, phụ thuộc vào vấn đề là gì. Nếu định nghĩa json khớp chính xác với định nghĩa kiểu C# thì nó chỉ hoạt động.

+0

thiếu dấu đóng) trên dòng thứ hai. – redwards510

8

Một cách tốt để serialize json vào C# là dưới đây:

RootObject ro = new RootObject(); 
    try 
    { 

     StreamReader sr = new StreamReader(FileLoc); 
     string jsonString = sr.ReadToEnd(); 
     JavaScriptSerializer ser = new JavaScriptSerializer(); 
     ro = ser.Deserialize<RootObject>(jsonString); 


    } 

bạn cần phải thêm một tham chiếu đến system.web.extensions trong .net 4.0 này là trong các tập tin chương trình (x86)> cụm tài liệu tham khảo> framework> system.web.extensions.dll và bạn cần chắc chắn rằng bạn đang sử dụng chỉ 4.0 khung công tác không phải 4.0 thường xuyên của khách hàng

+0

đừng quên sr.Close(); – user3704628

1

Sử dụng máy chủ.MapPath để có được những đường dẫn thực tế của tập tin JSON và tải và đọc các tập tin sử dụng StreamReader

using System; 
using System.Collections.Generic; 
using Newtonsoft.Json; 

public class RootObject 
{ 
    public string url_short { get; set; } 
    public string url_long { get; set; } 
    public int type { get; set; } 
} 

public class Program 
{ 
    static public void Main() 
    { 
     using (StreamReader r = new StreamReader(Server.MapPath("~/test.json"))) 
     { 
      string json = r.ReadToEnd(); 
      List<RootObject> ro = JsonConvert.DeserializeObject<List<RootObject>>(json); 
     } 

    Console.WriteLine(ro[0].url_short);     
    } 
} 

Lưu ý: Xem bên dưới liên kết cũng tôi đã trả lời cho câu hỏi tương tự như this.It sẽ được giúp đỡ đầy đủ cho bạn How to Parse an example string in C#

+0

Import System.IO. Mã của bạn không xây dựng. – thang

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