我试图通过使用c#类及其包含值的属性来创建jsonObject和json数组。请参阅下面的完整代码。
public class Product
{
public Int32 Id { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String Address { get; set; }
}
protected void Button1_Click(object sender, EventArgs e)
{
Product pr = new Product();
pr.Id = 10;
pr.FirstName = "John";
pr.LastName = "ab";
pr.Address = "My Add1";
string json = JsonConvert.SerializeObject(pr,Formatting.Indented);
System.IO.File.WriteAllText(@"d:\abcjson.json", json);
}
上面的代码给出了以下输出
{
"Id": 10,
"FirstName": "John",
"LastName": "ab",
"Address": My Add1,
}
但我需要以下输出,然后是jsonObject和jsonArray。请指导我如何通过在按钮单击下使用上面的json代码获得以下输出。提前谢谢。
{
"Product":[
{
"Id": 10,
"FirstName ":"John",
"lastName":"ab",
"Address":My add1
}
]
}
答案 0 :(得分:12)
要做的是看看你想要的JSON。它是一个具有Product
属性的对象,它是一个产品对象数组。
所以最简单的方法是创建一个类建模:
public class JsonRoot
{
[JsonProperty("Product")]
public List<Product> Products { get; set; }
}
然后你可以使用:
var root = new JsonRoot { Products = new List<Product> { pr } };
string json = JsonConvert.SerializeObject(root, Formatting.Indented);
您可以改为使用匿名类型:
var root = new { Product = new[] { pr } };
我个人不喜欢喜欢将匿名类型与命名类型混合进行序列化,但它应该可以正常工作......
答案 1 :(得分:4)
protected void Button1_Click(object sender, EventArgs e)
{
var pr = new
{
Product = new[]
{
new Product
{
Id = 10,
FirstName = "John",
LastName = "ab",
Address = "My Add1"
}
}
};
string json = JsonConvert.SerializeObject(pr,Formatting.Indented);
System.IO.File.WriteAllText(@"d:\abcjson.json", json);
}
答案 2 :(得分:1)
简单的解决方案是将您的对象放入集合中,如@JonSkeet建议的那样。
如果您认为,这是解决方案需要创建不可用的东西,例如List<Product>
和单独的json包装类,您可以使用匿名类型数组,如@MarkShevchenko建议的那样,或者在{{3}上做一些工作} class以下列方式:
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
using (JsonWriter writer = new JsonTextWriter(sw))
{
writer.Formatting = Formatting.Indented;
writer.WriteStartObject(); // {
writer.WritePropertyName("Product"); // "Product:"
writer.WriteStartArray(); // [
writer.WriteRaw(JsonConvert.SerializeObject(pr)); // your object
writer.WriteEnd(); // ]
writer.WriteEndObject(); //}
}
var result = sb.ToString();
结果字符串将存储在result
中,而不会创建匿名数组和单独的类。