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


238

我只是使用XmlWriter创建一些XML以通过HTTP响应发送回去。您将如何创建JSON字符串。我假设您只是使用stringbuilder来构建JSON字符串,并且它们将您的响应格式化为JSON?


在Asp.net C#codepedia.info
2015/

Answers:


249

您可以使用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文本。谢谢
PositiveGuy

如果您不使用.NET 3.5,该怎么办!da **它
PositiveGuy

2
如果要从.NET 2.0使用JavaScriptSerializer,则它是ASP.NET Ajax 1.0的一部分。
乔钟

2
您仍然可以使用它。它是ASP.NET 2.0 AJAX扩展1.0的一部分:asp.net/AJAX/Documentation/Live/mref/…–
Naren

我们的项目可以在VS 2008中打开...因此它在某个时候被转换了。这是否意味着我们现在可以在现有代码库中使用.NET 3.5?
PositiveGuy

366

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

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


8
微软现在在VS MVC4项目模板中将NewtonSoft作为标准配置发布
Chris F Carroll

45
您还可以在需要时序列化匿名对象:string json = JsonConvert.SerializeObject(new { "PropertyA" = obj.PropertyA });
马特·贝克曼

9
@MattBeckman我得到了“无效的匿名类型成员声明器。必须使用成员分配,简单名称或成员访问权限来声明匿名类型成员。不"PropertyA"应该PropertyA吗?
Jonah

因此,我们需要实现一个Class和对象,以构造一个简单的json!想象一下嵌套的-不是固定的数组-元素。我不明白为什么会有如此高的热情!
瓦西里斯

6
@MattBeckman @Jonah上string json = JsonConvert.SerializeObject(new { PropertyA = obj.PropertyA });没有双引号PropertyA.
何塞(Jose)


17

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

简单方便。谢谢。
QMaster

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

3
因此...取消对“ this”引用的注释,即可使此代码片段正常工作。如果您以前没有使用扩展方法,则可能并不明显。
丹·埃斯帕萨


7

您也可以尝试使用我的ServiceStack JsonSerializer,它是目前最快的.NET JSON序列化程序。它支持序列化DataContract,任何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倍


我用对象列表尝试了JsonSerializer.SerializeToString,它只是返回空的json:“ [{},{}]” pastebin.com/yEw57L3T 这是我调用SerializeToString i.imgur.com/dYIE7J1.png之前的对象外观不过,在这里获得最高票数的答案是可行的
Matthew Lock

最快的.NET JSON序列化程序链接已死。

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

然后可以通过调用获取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\"}}"

希望能帮助到你!


5

如果您不能或不想使用两个内置的JSON序列化器(JavaScriptSerializerDataContractJsonSerializer),则可以尝试JsonExSerializer库-我在许多项目中都使用了它,效果很好。


1
我已经尝试过JavaScriptSerializer,它不能与null对象一起使用。
路加101

1
@ Luke101:到底是什么?我的意思是我每天都在使用它,并且从未遇到过问题,所以我很好奇!(不讽刺,我真的很好奇,因为我从未遇到过问题)
Tamas Czinege

2

如果尝试创建Web服务以通过JSON将数据提供给网页,请考虑使用ASP.NET Ajax工具包:

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

它将自动将通过Web服务提供的对象转换为json,并创建可用于连接到它的代理类。


这只是对.ashx的调用,该调用将返回JSON字符串。首先,我只是想弄清楚如何形成字符串。使用StringBuilder吗?其次,是的,如何序列化。返回XML时,您只需要设置响应的内容类型即可:context.Response.ContentType =“ text / xml”
PositiveGuy

1

DataContractJSONSerializer会为你做的一切与容易,因为XmlSerializer的相同。在Web应用程序中使用它很简单。如果使用的是WCF,则可以通过属性指定其使用。DataContractSerializer系列也非常快。


1

我发现您根本不需要串行器。如果将对象作为列表返回。让我举个例子。

在我们的asmx中,我们使用传递的变量获取数据

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

然后使用jquery我们访问服务,并传递该变量。

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

我们得到了回应。

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

网址:“ getData.asmx / GetLatLon”,就像我期望服务器端代码中的GetLatLon方法一样。但是没有。
拉里

1

编码用法

JSON数组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);

结果:[[29,“麦克”],[5,“假人]]]

漂亮的用法

漂亮的打印JSON数组PrettyPrintJson()字符串扩展方法

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

结果是:

[
   14,
   4,
   [
      14,
      "data"
   ],
   [
      [
         5,
         "10.186.122.15"
      ],
      [
         6,
         "10.186.122.16"
      ]
   ]
]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.