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

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

857966 次浏览

如果您试图创建一个web服务,通过JSON向web页面提供数据,请考虑使用ASP。. NET Ajax工具包:

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

它会自动将你通过webservice服务的对象转换为json,并创建你可以用来连接到它的代理类。

你可以使用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();

这个库非常适合用于c#中的JSON

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

看看json-net的http://www.codeplex.com/json/。aspx项目。为什么要重新发明轮子?

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

DataContractJSONSerializer将像XMLSerializer一样简单地为你做所有事情。在web应用程序中使用它很简单。如果你正在使用WCF,你可以用一个属性指定它的用途。DataContractSerializer系列也非常快。

这个代码片段使用了。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());
}
}

你也可以试试我的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 x

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

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

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\"}}"

希望能有所帮助!

我发现你根本不需要序列化器。如果将对象作为List返回。 让我举个例子

在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}]}

< em > < / em >编码使用

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);
< p >结果: “迈克”][[29日,[5,“假”]]< / p >

漂亮的用法

Pretty print 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"
]
]
]

简单使用Newtonsoft。JsonNewtonsoft.Json.Linq库。

        //Create my object
var myData = 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 jsonData = JsonConvert.SerializeObject(myData);


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


//Parse the json object
JObject jsonObject = JObject.Parse(jsonData);


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

包括:

使用System.Text.Json;

然后像这样序列化你的object_to_serialize: JsonSerializer.Serialize (object_to_serialize) < / p >

如果你想避免创建一个类和创建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.Dynamic命名空间。