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

本文关键字:数字 JSON 对象 何使用 JavaScriptSerializer | 更新日期: 2023-09-27 18:25:58

我有一个像下面这样的对象要在C#中反序列化。我想知道如何解析它。我试着在这里遵循这个例子,但我被如何让我的类识别每个对象的键(下面的23)所困扰。

下面的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; }
}

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

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

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

这应该奏效。

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

我最终发现,将键值对从Javascript序列化到C#是不可能的。

我已经更改了代码,并在JS中创建了一个普通的对象数组,并将其发送到服务器。

但是可以将键值对从字符串变量解析为C#中的Dictionary或KeyValuePair<x、 x>

还可以使用C#构建一个键值对,并将其转换为JSON或JS