0

...而“美丽”在这里是讽刺的。

当您调用 Active Campaign 的list_view端点,并希望在 json 响应中获得它时,您会得到以下 json 响应:

{
    "0": {
        "id": "4",
        "name": "Nieuwsletter 1",
        "cdate": "2018-11-22 03:44:19",
        "private": "0",
        "userid": "6",
        "subscriber_count": 2901
    },
    "1": {
        "id": "5",
        "name": "Newsletter 2",
        "cdate": "2018-11-22 05:02:41",
        "private": "0",
        "userid": "6",
        "subscriber_count": 2229
    },
    "2": {
        "id": "6",
        "name": "Newsletter 3",
        "cdate": "2018-11-22 05:02:48",
        "private": "0",
        "userid": "6",
        "subscriber_count": 638
    },
    "result_code": 1,
    "result_message": "Success: Something is returned",
    "result_output": "json"
}

现在我怎么能将它反序列化为一个对象?执行正常的 Edit => Paste Special => Paste JSON As Classes 给了我一个输出,我最终得到了名为_2.

此外,JsonConvert 抛出以下错误:Accessed JObject values with invalid key value: 2. Object property name expected.所以它也不能真正反序列化它。我尝试将其dynamic用作要转换的对象类型。

我现在唯一能想到的是将第一个{by[和最后一个}by替换],然后删除所有"1" :项目,然后删除最后 3 个属性。之后,我有一个易于转换的基本数组。但我有点希望有人有更好的解决方案,而不是深入研究 string.indexOf 和 string.Replace 派对......

4

2 回答 2

3

如果您的键/值对不是固定的并且数据必须是可配置的,那么 Newtonsoft.json 有一个可以在这里使用的功能,那就是[JsonExtensionData]. 阅读更多

现在在序列化对象时写入扩展数据。读取和写入扩展数据可以自动往返所有 JSON,而无需将每个属性添加到要反序列化的 .NET 类型。只声明您感兴趣的属性,让扩展数据完成其余的工作。

在您的情况下,键/值对0,1,2,3.......N具有动态数据,因此您的课程将是

因此,创建一个属性来收集您的所有动态键/值对以及属性[JsonExtensionData]。下面我用 name 创建那个DynamicData

class MainObj
{
    [JsonExtensionData]
    public Dictionary<string, JToken> DynamicData { get; set; }

    public int result_code { get; set; }
    public string result_message { get; set; }
    public string result_output { get; set; }
}

然后你可以像反序列化你的 JSON

string json = "Your json here"

MainObj mainObj = JsonConvert.DeserializeObject<MainObj>(json); 

编辑:

如果您想将动态键的值收集到类,那么您可以在类结构下方使用。

class MainObj
{
    [JsonExtensionData]
    public Dictionary<string, JToken> DynamicData { get; set; }

    [JsonIgnore]
    public Dictionary<string, ChildObj> ParsedData
    {
        get
        {
            return DynamicData.ToDictionary(x => x.Key, y => y.Value.ToObject<ChildObj>());
        }
    }

    public int result_code { get; set; }
    public string result_message { get; set; }
    public string result_output { get; set; }
}

public class ChildObj
{
    public string id { get; set; }
    public string name { get; set; }
    public string cdate { get; set; }
    public string _private { get; set; }
    public string userid { get; set; }
    public int subscriber_count { get; set; }
}

然后你可以像反序列化你的 JSON

MainObj mainObj = JsonConvert.DeserializeObject<MainObj>(json);

然后您可以访问您的每个反序列化数据,例如

int result_code = mainObj.result_code;
string result_message = mainObj.result_message;
string result_output = mainObj.result_output;

foreach (var item in mainObj.ParsedData)
{
    string key = item.Key;
    ChildObj childObj = item.Value;

    string id = childObj.id;
    string name = childObj.name;
    string cdate = childObj.cdate;
    string _private = childObj._private;
    string userid = childObj.userid;
    int subscriber_count = childObj.subscriber_count;
}
于 2019-01-22T10:40:48.123 回答
2

我会JObjectNewtonsoft.Json图书馆推荐

例如使用 C# 交互

// Assuming you've installed v10.0.1 of Newtonsoft.Json using a recent version of nuget
#r "c:\Users\MyAccount\.nuget\.nuget\packages\Newtonsoft.Json\10.0.1\lib\net45\Newtonsoft.Json.dll"

using Newtonsoft.Json.Linq;
var jobj = JObject.Parse(File.ReadAllText(@"c:\code\sample.json"));
foreach (var item in jobj)
{
     if (int.TryParse(item.Key, out int value))
     {
         Console.WriteLine((string)item.Value["id"]);

         // You could then convert the object to a strongly typed version
         var listItem = item.Value.ToObject<YourObject>();
      }
}

哪个输出:

 4
 5
 6

有关更多详细信息,请参阅此页面

https://www.newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm

于 2019-01-22T10:22:27.120 回答