将活动活动的漂亮 json 输出反序列化为 C# 对象



。。。"美丽"在这里是讽刺。

当您调用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作为对象类型来转换为.

我现在唯一能想到的是用[替换第一个{,用]替换最后一个},然后删除所有"1" :项,然后删除最后3个属性。之后,我有了一个基本的数组,它很容易转换。但我有点希望有人能找到更好的解决方案,而不是深入字符串。indexOf和字符串。替换参与方。。。

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

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

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

因此,创建一个属性来收集具有属性[JsonExtensionData]的所有动态键/值对。下面我创建了一个名为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;
}

我推荐Newtonsoft.Json库中的JObject

例如使用C#交互式

// Assuming you've installed v10.0.1 of Newtonsoft.Json using a recent version of nuget
#r "c:UsersMyAccount.nuget.nugetpackagesNewtonsoft.Json10.0.1libnet45Newtonsoft.Json.dll"
using Newtonsoft.Json.Linq;
var jobj = JObject.Parse(File.ReadAllText(@"c:codesample.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

相关内容

  • 没有找到相关文章

最新更新