我只是使用XmlWriter创建了一些XML,以便在HTTP响应中发回。如何创建JSON字符串?我猜你会使用stringbuilder来构建JSON字符串,然后将响应格式化为JSON?


当前回答

如果你想避免创建一个类和创建JSON,那么创建一个动态对象和序列化对象。

            dynamic data = new ExpandoObject();
            data.name = "kushal";
            data.isActive = true;

            // convert to JSON
            string json = Newtonsoft.Json.JsonConvert.SerializeObject(data);

读取JSON并像这样反序列化:

            // convert back to Object
            dynamic output = Newtonsoft.Json.JsonConvert.DeserializeObject(json);

            // read a particular value:
            output.name.Value

ExpandoObject来自System。动态名称空间。

其他回答

您可以使用JavaScriptSerializer类来构建一个有用的扩展方法。

文章中的代码:

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);
        }
    }
}

用法:

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();

如果你不能或不想使用两个内置的JSON序列化器(JavaScriptSerializer和DataContractJsonSerializer),你可以尝试JsonExSerializer库——我在许多项目中使用它,工作得很好。

如果你想避免创建一个类和创建JSON,那么创建一个动态对象和序列化对象。

            dynamic data = new ExpandoObject();
            data.name = "kushal";
            data.isActive = true;

            // convert to JSON
            string json = Newtonsoft.Json.JsonConvert.SerializeObject(data);

读取JSON并像这样反序列化:

            // convert back to Object
            dynamic output = Newtonsoft.Json.JsonConvert.DeserializeObject(json);

            // read a particular value:
            output.name.Value

ExpandoObject来自System。动态名称空间。

你也可以试试我的ServiceStack JsonSerializer,它是目前最快的。net JSON序列化器。它支持序列化数据契约、任何POCO类型、接口、晚期绑定对象(包括匿名类型)等。

基本的例子

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

注意:如果性能对您来说不重要,请只使用microsoft JavaScriptSerializer,因为它比其他JSON序列化器慢了40 -100倍,所以我不得不将它排除在基准测试之外。

如果你需要复杂的结果(嵌入),创建你自己的结构:

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;
        }                
    };
}

然后通过调用获取JSON字符串

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);

结果是这样的:

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

希望能有所帮助!