如何将 C# 类属性转换为 Json 文件

5

我正在尝试使用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
  }
]
}

有一个相当不错的在线工具,可以让您输入JSON并生成反映它的C#类。只需在Google中搜索“json to c# converter”或类似内容。该网站实际上称为csharp2json.com或类似名称。 - Lodestone6
可能只需要创建另一个类来充当当前类的根,就像这样:public class rootProduct() { public Product product {get; set;} } 然后,在声明所有类似于“rootProduct.Product.ID = 10;” 的内容后,对rootProduct进行序列化。 - Lodestone6
3个回答

14

需要做的事情是查看您想要的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 } };

就我个人而言,我不太喜欢在序列化中混合使用匿名类型和命名类型,但这样应该没问题...


谢谢您的回复,您的意思是我应该创建一个单独的类来获取我想要的输出吗?如果是的话,那么我的问题是为什么您将其称为JsonRoot?对不起,我的问题可能有些愚蠢,但我需要澄清我的困惑。 - Rauf Abid
为什么你把它叫做JsonProperty,比如[JsonProperty("Product")]。谢谢。 - Rauf Abid
@RaufAbid:我将其称为JsonRoot,因为您将其用作JSON输出的根对象。我使用了JsonProperty属性来“重命名”JSON中的Products属性(由于是复数形式,这是C#的惯用语)为Property - Jon Skeet
[JsonProperty("Product")] 是否负责创建像我的案例中的Product这样的根对象?此外,这个对象还能做些什么?还请您初始化Products列表以使用一些值来获得Json结果,其中每个数组值之间用逗号分隔多个行。非常感谢并感激您的帮助。 - Rauf Abid
@RaufAbid:我建议你阅读JsonPropertyAttribute的文档。在这种情况下,它只是将产生的JSON中的属性重命名而已。而且我已经向你展示了如何使用一个值来初始化列表——就是一个List<Product>;如果你使用两个值来初始化它,它会自动处理正确的事情。在寻求进一步帮助之前,请尝试自己解决问题。 - Jon Skeet
谢谢Jon,讲解得很好,我得到了想要的结果 :) - Rauf Abid

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

由于各种原因,那段代码无法编译。 - Jon Skeet
@JonSkeet,抱歉。复制粘贴和不注意。已修复。 - Mark Shevchenko
好多了 :) 我在我的答案中包含了匿名类型选项 - 这可能不是我会做的事情,如果我确实这样做了,我会在初始化常规 Product 后的最后一步执行它,但这只是个人风格选择。 - Jon Skeet

1
简单的解决方法是将您的对象放入集合中,就像@JonSkeet建议的那样。
如果您认为这种解决方法需要创建一些无用的东西,比如List<Product>和单独的json包装类,您可以使用匿名类型数组,就像@MarkShevchenko建议的那样,或者按以下方式对JsonWriter类进行一些工作:
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中,而不需要创建匿名数组和单独的类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接