【问题标题】:How can I use JavaScriptSerializer in c# to parse Json with unknown number of Keys and Values?如何在 c# 中使用 JavaScriptSerializer 解析具有未知数量的键和值的 Json?
【发布时间】:2013-03-13 04:43:49
【问题描述】:

如果我有一个包含未知数量的键和值的 Json 字符串。如何在 c# 中将所有值获取到数组或对象中?

在下面的示例中,我知道有“id”和“index”字段。如果我不知道字段中的键怎么办?

另一种情况,如果键的数量很大,我不能声明变量怎么办?

[{"id":"449342","index":0},{"id":"449343","index":1}]

我像这样反序列化上面的 Json。上面提到的两种情况呢?

JavaScriptSerializer js = new JavaScriptSerializer();
        AllLiTags[] Tags = js.Deserialize<AllLiTags[]>(LiOrder);

public class AllLiTags
{
    public string Id { get; set; }
    public string Index { get; set; }
}

【问题讨论】:

标签: c# asp.net json javascriptserializer


【解决方案1】:

要么反序列化成字典,要么获取更面向这种用法的nuget包Json.NET、(documentation)。

反序列化成字典如下所示:

var tags = js.Deserialize<Dictionary<string, string>[]>(LiOrder);
string secondOrderIndex = tags[1]["index"];

你会丢失类型信息(数字转换为字符串等),我怀疑它会处理嵌套对象。

使用 Json.NET 看起来像:

var tags = JArray.Parse(LiOrder);
string secondOrderIndex = tags[1]["index"].GetValue<string>();
int idx = 0;
foreach (var order in tags) {
    foreach (var prop in order) {
        Console.WriteLine("Order {0}'s {1} property has value {2}",
                          idx,
                          prop.Name,
                          prop.Value.ToString());
    }
    idx++;
}

【讨论】:

  • @Subin 如果你这样做,比如说js.Deserialize&lt;Dictionary&lt;string, string&gt;[]&gt;&gt;(LiOrder),你会捕获平面对象的数组 OK,但我不确定它对对象的处理效果如何-对象内。
  • 您使用它是因为您知道有两个键并且它们是字符串。如果我不知道会有多少键,例如 id、index、something、something 等等。或者如果有大量键
  • @Subin 原始类型将被转换为字符串。是的,你会失去 1 和“1”、真和“真”之间的区别,但如果你一开始不知道形状,那可能不会有很大的损失。使用Json.NET,您绝对可以反序列化任何形状的对象图。如果您知道如何浏览图表和您期望的类型,您可以执行以下操作:var tags = JArray.Parse(LiOrder); var secondOrderIndex = tags[1]["index"].GetValue&lt;string&gt;();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多