如何在C#中创建JSON字符串

Pos*_*Guy 222 c# asp.net json

我刚刚使用XmlWriter创建了一些XML,以便在HTTP响应中发回.你将如何创建一个JSON字符串.我假设您只是使用stringbuilder来构建JSON字符串,并将它们的响应格式化为JSON?

Orr*_*Orr 348

使用 Newtonsoft.Json让它变得非常简单:

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);
Run Code Online (Sandbox Code Playgroud)

文档:序列化和反序列化JSON

  • 您还可以在需要时序列化匿名对象:``string json = JsonConvert.SerializeObject(new {"PropertyA"= obj.PropertyA});``. (41认同)
  • @MattBeckman我得到"无效的匿名类型成员声明符.必须使用成员赋值,简单名称或成员访问来声明匿名类型成员.不应该`"PropertyA"`是`PropertyA`? (9认同)
  • MS现在将NewtonSoft作为VS MVC4项目模板中的标准 (8认同)
  • @MattBeckman @Jonah是`string json = JsonConvert.SerializeObject(new {PropertyA = obj.PropertyA});`PropertyA上没有双引号。 (6认同)
  • 所以我们需要实现一个Class和对象,来构造一个简单的json!想象一下嵌套的(而不是固定的数组)元素。我不明白为什么空气中如此热情! (3认同)

CMS*_*CMS 243

您可以使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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();
Run Code Online (Sandbox Code Playgroud)

  • 如果您想从.NET 2.0中使用它,JavaScriptSerializer是ASP.NET Ajax 1.0的一部分. (2认同)
  • 你仍然可以使用它.它是ASP.NET 2.0 AJAX Extensions 1.0的一部分:http://www.asp.net/AJAX/Documentation/Live/mref/T_System_Web_Script_Serialization_JavaScriptSerializer.aspx (2认同)

Hug*_*are 18

这个库非常适合来自C#的JSON

http://james.newtonking.com/pages/json-net.aspx


Joe*_*ung 13

此代码段使用.NET 3.5中System.Runtime.Serialization.Json的DataContractJsonSerializer.

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 所以...取消注释'this'引用实际上让这个代码片段正常工作.如果您之前没有使用过扩展方法,这可能并不明显. (3认同)

小智 7

请访问http://www.codeplex.com/json/查看json-net.aspx项目.为什么重新发明轮子?

  • 取决于,我可能不想依赖第三方开源插件来创建JSON.宁愿自己创建字符串/辅助方法. (3认同)

myt*_*thz 7

You can also try my ServiceStack JsonSerializer it's the fastest .NET JSON serializer at the moment. It supports serializing DataContracts, any POCO Type, Interfaces, Late-bound objects including anonymous types, etc.

Basic Example

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

Note: Only use Microsofts JavaScriptSerializer if performance is not important to you as I've had to leave it out of my benchmarks since its up to 40x-100x slower than the other JSON serializers.


小智 7

Simlpe使用Newtonsoft.JsonNewtonsoft.Json.Linq库。

        //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"]);
Run Code Online (Sandbox Code Playgroud)


Kus*_*eth 7

如果您想避免创建类并创建 JSON,则创建动态对象并序列化对象。

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

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

Run Code Online (Sandbox Code Playgroud)

读取 JSON 并反序列化,如下所示:

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

            // read a particular value:
            output.name.Value
Run Code Online (Sandbox Code Playgroud)

ExpandoObject来自System.Dynamic命名空间。


Sub*_*Fox 6

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

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;
        }                
    };
}
Run Code Online (Sandbox Code Playgroud)

然后你可以通过调用获得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);
Run Code Online (Sandbox Code Playgroud)

结果将是这样的:

json = "{\"registration_ids\":[\"id1\",\"id2\"],\"data\":{\"message\":\"Your message\",\"tickerText\":\"Your ticket\",\"contentTitle\":\"Your content\"}}"
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!


Tam*_*ege 5

如果你不能或不想使用两个内置JSON序列化(JavaScriptSerializerDataContractJsonSerializer),你可以尝试JsonExSerializer库-我使用它的一些项目和工作得很好.