如何使用JavaScriptSerializer使用数字键解析JSON对象

时间:2014-10-09 05:32:34

标签: c# asp.net .net json javascriptserializer

我有一个像下面这样的对象在C#中被反序列化。我想知道如何解析它。我尝试关注this example here,但我很难理解如何让我的课程识别每个对象的关键字(2和下面的3)。

下面的JSON字符串基本上代表2个事务。我想将每个事务表示转换为Transaction对象,并将其放入Transaction对象数组中。

{
    "2": {
        "id": "2",
        "user_id": "59",
        "offer_id": "1234"
    },
    "3": {
        "id": "3",
        "user_id": "59",
        "offer_id": "1234"
    }
}

以下是我的课程:

public class Transactions
{
    // what goes here since the "key" field is always different?
}

public class Transaction
{
    public int id { get; set; }
    public int user_id { get; set; }
    public int offer_id { get; set; }
}

2 个答案:

答案 0 :(得分:2)

可以使用JSON.Net库中的JObject来完成。

var transactions = JObject.Parse(json).PropertyValues()
                                      .Select(o => o.ToObject<Transaction>());

这应该可以解决问题。

答案 1 :(得分:0)

使用JavaScriptSerializer,您可以通过反序列化为Dictionary<string, Transaction>来解决此问题。如果需要,可以从那里轻松地将其转换为数组。

示例代码:

string json = @"
{
    ""2"": {
        ""id"": ""2"",
        ""user_id"": ""59"",
        ""offer_id"": ""1234""
    },
    ""3"": {
        ""id"": ""3"",
        ""user_id"": ""59"",
        ""offer_id"": ""1234""
    }
}";

var serializer = new JavaScriptSerializer();
var dict = serializer.Deserialize<Dictionary<string, Transaction>>(json);
var transactions = dict.Select(kvp => kvp.Value).ToArray();

foreach (Transaction t in transactions)
{
    Console.WriteLine(string.Format(
        "id: {0}, user_id: {1}, offer_id: {2}", t.id, t.user_id, t.offer_id));
}