Cách tạo chuỗi JSON trong C #


238

Tôi vừa sử dụng XmlWriter để tạo một số XML để gửi lại trong phản hồi HTTP. Làm thế nào bạn sẽ tạo một chuỗi JSON. Tôi giả sử bạn sẽ chỉ sử dụng một trình tạo chuỗi để xây dựng chuỗi JSON và chúng định dạng phản hồi của bạn dưới dạng JSON?


Kiểm tra 3 cách này để chuyển đổi dữ liệu thành Chuỗi JSON trong Asp.net C # codepedia.info/2015/07/ Kẻ
Satinder singh

Câu trả lời:


249

Bạn có thể sử dụng lớp JavaScriptSerializer , kiểm tra bài viết này để xây dựng một phương thức mở rộng hữu ích.

Mã từ bài viết:

namespace ExtensionMethods
{
    public static class JSONHelper
    {
        public static string ToJSON(this object obj)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            return serializer.Serialize(obj);
        }

        public static string ToJSON(this object obj, int recursionDepth)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            serializer.RecursionLimit = recursionDepth;
            return serializer.Serialize(obj);
        }
    }
}

Sử dụng:

using ExtensionMethods;

...

List<Person> people = new List<Person>{
                   new Person{ID = 1, FirstName = "Scott", LastName = "Gurthie"},
                   new Person{ID = 2, FirstName = "Bill", LastName = "Gates"}
                   };


string jsonString = people.ToJSON();

vâng, chỉ cần cố gắng tìm ra cách tạo văn bản JSON trước. Cảm ơn
Tích cực,

Nếu bạn không sử dụng .NET 3.5 thì sao? da ** it
positiveGuy

2
JavaScriptSerializer là một phần của ASP.NET Ajax 1.0 nếu bạn muốn sử dụng nó từ .NET 2.0.
Joe Chung

2
Bạn vẫn có thể sử dụng nó. Một phần của Phần mở rộng AJAX ASP.NET 2.0 1.0: asp.net/AJAX/Documentation/Live/mref/ mẹo
Naren

dự án của chúng tôi có thể mở trong VS 2008 ... vì vậy nó đã được chuyển đổi tại một số điểm. Điều đó có nghĩa là bây giờ chúng ta có thể sử dụng .NET 3.5 trong cơ sở mã hiện tại của chúng tôi?
positiveGuy

366

Sử dụng Newtonsoft.Json làm cho nó thực sự dễ dàng hơn:

Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };

string json = JsonConvert.SerializeObject(product);

Tài liệu: Tuần tự hóa và giải tuần tự JSON


8
MS hiện gửi NewtonSoft theo tiêu chuẩn trong mẫu dự án VS MVC4
Chris F Carroll

45
Bạn cũng có thể tuần tự hóa các đối tượng ẩn danh khi cần : string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });.
Matt Beckman

9
. @MattBeckman tôi nhận được "thành viên hợp lệ vô danh loại thành viên declarator loại Chưa xác định phải được khai báo với một nhiệm vụ thành viên, tên đơn giản hay truy cập thành viên không nên. "PropertyA"Được PropertyA?
Jonah

Vì vậy, chúng ta cần phải thực hiện một Class và các đối tượng, để xây dựng một json đơn giản! Hãy tưởng tượng lồng nhau - không phải mảng cố định - các phần tử. Tôi không thể thấy tại sao rất nhiều nhiệt tình trong không khí!
Vassilis

6
@MattBeckman @Jonah string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });không có dấu ngoặc kép trênPropertyA.
Jose


17

Sử dụng Simlpe của Newtonsoft.JsonNewtonsoft.Json.Linq thư viện.

        //Create my object
        var my_jsondata = new
        {
            Host = @"sftp.myhost.gr",
            UserName = "my_username",
            Password = "my_password",
            SourceDir = "/export/zip/mypath/",
            FileName = "my_file.zip"
        };

        //Tranform it to Json object
        string json_data = JsonConvert.SerializeObject(my_jsondata);

        //Print the Json object
        Console.WriteLine(json_data);

        //Parse the json object
        JObject json_object = JObject.Parse(json_data);

        //Print the parsed Json object
        Console.WriteLine((string)json_object["Host"]);
        Console.WriteLine((string)json_object["UserName"]);
        Console.WriteLine((string)json_object["Password"]);
        Console.WriteLine((string)json_object["SourceDir"]);
        Console.WriteLine((string)json_object["FileName"]);

Đơn giản và tiện dụng. Cảm ơn.
QMaster

13

Đoạn mã này sử dụng DataContractJsonSerializer từ System.R nb.Serialization.Json trong .NET 3.5.

public static string ToJson<T>(/* this */ T value, Encoding encoding)
{
    var serializer = new DataContractJsonSerializer(typeof(T));

    using (var stream = new MemoryStream())
    {
        using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, encoding))
        {
            serializer.WriteObject(writer, value);
        }

        return encoding.GetString(stream.ToArray());
    }
}

3
Vì vậy, ... bỏ qua tham chiếu 'cái này' để thực sự làm cho đoạn mã này hoạt động. Nếu bạn chưa từng làm việc với các phương thức mở rộng trước đây, điều này có thể không rõ ràng.
Dan Esparza

7

Hãy xem http://www.codeplex.com/json/ cho dự án json-net.aspx. Tại sao lại phát minh ra bánh xe?


3
phụ thuộc, tôi có thể không muốn dựa vào plugin nguồn mở của bên thứ 3 chỉ để tạo JSON. Thay vì tự tạo phương thức chuỗi / trình trợ giúp.
positiveGuy

7

Bạn cũng có thể dùng thử ServiceStack JsonSerializer, đây là trình tuần tự hóa .NET JSON nhanh nhất vào lúc này. Nó hỗ trợ tuần tự hóa DataContuces, mọi loại POCO, Giao diện, các đối tượng bị ràng buộc muộn bao gồm các loại ẩn danh, v.v.

Ví dụ cơ bản

var customer = new Customer { Name="Joe Bloggs", Age=31 };
var json = JsonSerializer.SerializeToString(customer);
var fromJson = JsonSerializer.DeserializeFromString<Customer>(json); 

Lưu ý: Chỉ sử dụng microsofts JavaScriptSerializer nếu hiệu suất không quan trọng đối với bạn vì tôi phải rời khỏi điểm chuẩn của mình vì tốc độ của nó chậm hơn tới 40x-100x so với các trình sắp xếp JSON khác.


Tôi đã thử JsonSerializer.SerializeToString với một danh sách các đối tượng và nó chỉ trả về json trống: "[{}, {}]" pastebin.com/yEw57L3T Đây là đối tượng của tôi trông như thế nào trước khi tôi gọi serializeToString i.imgur.com/dYIE7J Câu trả lời được bình chọn hàng đầu ở đây đã có hiệu quả, trả lại những gì tôi mong đợi: pastebin.com/aAtB3Gxu
Matthew Lock

liên kết nối tiếp .NET JSON nhanh nhất đã chết.

6

Nếu bạn cần kết quả phức tạp (được nhúng), hãy tạo cấu trúc của riêng bạn:

class templateRequest
{
    public String[] registration_ids;
    public Data data;
    public class Data
    {
        public String message;
        public String tickerText;
        public String contentTitle;
        public Data(String message, String tickerText, string contentTitle)
        {
            this.message = message;
            this.tickerText = tickerText;
            this.contentTitle = contentTitle;
        }                
    };
}

và sau đó bạn có thể có được chuỗi JSON bằng cách gọi

List<String> ids = new List<string>() { "id1", "id2" };
templateRequest request = new templeteRequest();
request.registration_ids = ids.ToArray();
request.data = new templateRequest.Data("Your message", "Your ticker", "Your content");

string json = new JavaScriptSerializer().Serialize(request);

Kết quả sẽ như thế này:

json = "{\"registration_ids\":[\"id1\",\"id2\"],\"data\":{\"message\":\"Your message\",\"tickerText\":\"Your ticket\",\"contentTitle\":\"Your content\"}}"

Hy vọng nó giúp!


5

Nếu bạn không thể hoặc không muốn sử dụng hai trình tuần tự hóa JSON tích hợp ( JavaScriptSerializerDataContractJsonSerializer ), bạn có thể thử thư viện JsonExSerializer - Tôi sử dụng nó trong một số dự án và hoạt động khá tốt.


1
tôi đã thử JavaScriptSerializer và nó không hoạt động tốt với các đối tượng null.
Luke101

1
@ Luke101: Chính xác như thế nào? Tôi có nghĩa là tôi sử dụng nó hàng ngày và không bao giờ có vấn đề, vì vậy tôi thực sự tò mò! (không trớ trêu, tôi thực sự tò mò vì tôi chưa bao giờ gặp phải vấn đề nào)
Tamas Czinege

2

Nếu bạn đang cố gắng tạo một dịch vụ web để phân phát dữ liệu qua JSON đến một trang web, hãy xem xét sử dụng bộ công cụ ASP.NET Ajax:

http://www.asp.net/learn/ajax/tutorial-05-cs.aspx

Nó sẽ tự động chuyển đổi các đối tượng của bạn được cung cấp qua dịch vụ web thành json và tạo lớp proxy mà bạn có thể sử dụng để kết nối với nó.


nó sẽ chỉ là một cuộc gọi đến .ashx sẽ trả về một chuỗi JSON. Đầu tiên, tôi chỉ đang cố gắng tìm ra cách tạo chuỗi..sử dụng StringBuilder? Thứ hai sau đó, làm thế nào để tuần tự hóa. Khi trả về XML, bạn chỉ cần đặt loại tiếp theo của câu trả lời Tôi nghĩ: bối cảnh.Response.ContentType = "text / xml"
positiveGuy

1

Các DataContractJSONSerializer sẽ làm mọi thứ cho bạn với cùng dễ dàng như các XMLSerializer. Nó tầm thường để sử dụng điều này trong một ứng dụng web. Nếu bạn đang sử dụng WCF, bạn có thể chỉ định sử dụng nó với một thuộc tính. Họ DataContractSerializer cũng rất nhanh.


1

Tôi thấy rằng bạn không cần serializer. Nếu bạn trả về đối tượng dưới dạng Danh sách. Hãy để tôi sử dụng một ví dụ.

Trong asmx của chúng tôi, chúng tôi nhận được dữ liệu bằng cách sử dụng biến chúng tôi đã chuyển qua

// return data
[WebMethod(CacheDuration = 180)]
public List<latlon> GetData(int id) 
{
    var data = from p in db.property 
               where p.id == id 
               select new latlon
               {
                   lat = p.lat,
                   lon = p.lon

               };
    return data.ToList();
}

public class latlon
{
    public string lat { get; set; }
    public string lon { get; set; }
}

Sau đó, sử dụng jquery, chúng tôi truy cập dịch vụ, chuyển qua biến đó.

// get latlon
function getlatlon(propertyid) {
var mydata;

$.ajax({
    url: "getData.asmx/GetLatLon",
    type: "POST",
    data: "{'id': '" + propertyid + "'}",
    async: false,
    contentType: "application/json;",
    dataType: "json",
    success: function (data, textStatus, jqXHR) { //
        mydata = data;
    },
    error: function (xmlHttpRequest, textStatus, errorThrown) {
        console.log(xmlHttpRequest.responseText);
        console.log(textStatus);
        console.log(errorThrown);
    }
});
return mydata;
}

// call the function with your data
latlondata = getlatlon(id);

Và chúng tôi nhận được phản hồi của chúng tôi.

{"d":[{"__type":"MapData+latlon","lat":"40.7031420","lon":"-80.6047970}]}

url: "getData.asmx / GetLatLon", như tôi mong đợi phương thức GetLatLon trong mã phía máy chủ của bạn. Nhưng không có.
Lali

1

Sử dụng mã hóa

Đối tượng đơn giản cho JSON Array EncodeJsObjectArray ()

public class dummyObject
{
    public string fake { get; set; }
    public int id { get; set; }

    public dummyObject()
    {
        fake = "dummy";
        id = 5;
    }

    public override string ToString()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append('[');
        sb.Append(id);
        sb.Append(',');
        sb.Append(JSONEncoders.EncodeJsString(fake));
        sb.Append(']');

        return sb.ToString();
    }
}

dummyObject[] dummys = new dummyObject[2];
dummys[0] = new dummyObject();
dummys[1] = new dummyObject();

dummys[0].fake = "mike";
dummys[0].id = 29;

string result = JSONEncoders.EncodeJsObjectArray(dummys);

Kết quả: [[29, "mike"], [5, "giả"]]

Cách sử dụng khá

Phương pháp mở rộng chuỗi JSON khá PrettyPrintJson ()

string input = "[14,4,[14,\"data\"],[[5,\"10.186.122.15\"],[6,\"10.186.122.16\"]]]";
string result = input.PrettyPrintJson();

Kết quả là:

[
   14,
   4,
   [
      14,
      "data"
   ],
   [
      [
         5,
         "10.186.122.15"
      ],
      [
         6,
         "10.186.122.16"
      ]
   ]
]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.