C#动态属性的JSON对象

4
我需要输出这个json:
{
      white: [0, 60],
      green: [60, 1800],
      yellow: [1800, 3000],
      red: [3000, 0]
}

我正在尝试思考一个像这样的模型:

 public class Colors
    {

        public int[] white { get; set; }

        public int[] green { get; set; }

        public int[] yellow { get; set; }

        public int[] red { get; set; }
    }

但是属性名称可能会更改,例如白色现在可以变为灰色等。

有任何线索吗?


2
那么Dictionary<string, int[]>怎么样?你根本不需要那个Colors类。 - maccettura
查看DataContract类和System.ComponentModel命名空间。 - Ryan Wilson
您所需的JSON格式无效,您需要在JSON中用"包装字段名称。 - Markiian Benovskyi
1
首先确保你真的在生成json,因为那不是合法的json。你的属性缺少引号,如果它应该是json,它必须是"white": [0, 60],"green": [60, 1800]等等。除此之外,你正在寻找一个简单的字典,就像@maccettura评论的那样。 - Lasse V. Karlsen
1
@styx 为什么?JSON.Net 已经可以返回弱类型对象或反序列化为 dynamic - Panagiotis Kanavos
显示剩余7条评论
3个回答

7

你只需要一本词典:

Dictionary<string, int[]> dictionary = new Dictionary<string, int[]>();

dictionary.Add("white", new int[] { 0, 60 });
dictionary.Add("green", new int[] { 60, 1800 });
dictionary.Add("yellow", new int[] { 1800, 3000 });
dictionary.Add("red", new int[] { 3000, 0 });

//JSON.NET to serialize
string outputJson = JsonConvert.SerializeObject(dictionary)

这个 json 中的结果:

{
    "white": [0, 60],
    "green": [60, 1800],
    "yellow": [1800, 3000],
    "red": [3000, 0]
}

Fiddle here


不需要,因为Json.NET在解析任意字符串时返回一个弱类型对象。只有反序列化需要一个强类型对象。 - Panagiotis Kanavos
@PanagiotisKanavos,我不明白你在说什么。如果JSON.NET正在解析字符串,那不就是反序列化吗?按照你自己的评论,这将需要一个强类型对象?OP想要生成一个非常明显是字符串/int[]字典的特定JSON,有什么比这更好的解决方案呢? - maccettura
一个简单的 JObject.ToString() - Panagiotis Kanavos
@maccettura 我认为最好将 JsonConvert.SerializeObject(dictionary) 包含在答案中。因为现在它只显示如何向字典添加项目和有限结果。 - Aleks Andreev
1
这个小提琴包括在内,我可以将其添加到答案正文中。 OP 的声望足够高,我认为他们不需要帮助实际序列化,而是需要知道如何制作“动态”对象以进行序列化。 - maccettura
@maccettura,感谢您的编辑,已点赞。请不要忘记,您的答案不仅对问题提出者有用,也可能对其他人有用。此外,连接到代码示例的链接可能会在一段时间后失效。但是在您最后的编辑中,您的答案已经是完整的。 - Aleks Andreev

2
如果您不介意使用额外的库,可以尝试使用Json.Net(ASP.net已预装此库)。您只需:
dynamic result = JsonConvert.DeserializeObject(json);

如果我没记错的话,要访问一个值,请使用result[0].Value;

Json.NET不是一个额外的库,它是ASP.NET Web API和Core模板的内置默认值。 - Panagiotis Kanavos
@TheMCProgrammer 我部分地说错了,它是内置在.NET Core中的,但在其他项目类型中它只是一个可选的NuGet包。 - maccettura
明白了,没问题。 - user7159857

1
Json.NET是几乎所有ASP.NET项目(包括ASP.NET Web API和所有ASP.NET Core项目)使用的库。它可以将JSON反序列化为强类型对象或解析为弱类型JObject,也可以从任何对象生成JSON。无需创建特殊的类或对象。
您可以使用JsonConvert.SerializeObject将任何对象序列化为Json字符串。
var json=JsonConvert.SerializeObject(someObject);

或者您可以将JObject作为动态对象使用,并直接将其转换为字符串:

dynamic product = new JObject();
product.ProductName = "Elbow Grease";
product.Enabled = true;
product.Price = 4.90m;
product.StockCount = 9000;
product.StockValue = 44100;
product.Tags = new JArray("Real", "OnSale");

Console.WriteLine(product.ToString());

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