gpt4 book ai didi

c# - json 牛顿软件 : Deserialize Object containing a list of string

转载 作者:太空狗 更新时间:2023-10-29 23:59:53 24 4
gpt4 key购买 nike

我对这个 json 有以下问题:

{
"EVTS": {
"EVT": [
{ "ID": "123456",
"KEY1" : "somekey",
"CATEG": [
"cat1",
"cat2",
"cat3"
]
}
]}
}

和这个 c# 类:

public class myClass{
public string ID { get; set; }
public string KEY1 { get; set; }

public list<string> CATEG { get; set; }
}

public class ESObject1
{

[JsonProperty("EVT")]
public List<myClass> EVT { get; set; }
}

public class ESObject0
{

[JsonProperty("EVTS")]
public ESObject1 EVTS { get; set; }
}

这里我调用反序列化器:

ESObject0 globalobject = JsonConvert.DeserializeObject<ESObject0>(json);

但是最后一个代码不起作用,我抛出了这个异常:System.ArgumentException: Could not cast or convert from System.String to System.Collections.Generic.List 1[System.String].`

我使用 list<string> 而不是 string [] 并且只有 string 似乎没有任何效果。

请问我怎样才能正确反序列化这个对象。

谢谢。

最佳答案

您的代码似乎没有任何明显的问题,正如这个工作示例所示:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;

public class myClass
{
public string ID { get; set; }
public string KEY1 { get; set; }
public List<string> CATEG { get; set; }
}

public class ESObject1
{
[JsonProperty("EVT")]
public List<myClass> EVT { get; set; }
}

public class ESObject0
{
[JsonProperty("EVTS")]
public ESObject1 EVTS { get; set; }
}


class Program
{
static void Main()
{
string json =
@"{
""EVTS"": {
""EVT"": [
{
""ID"": ""123456"",
""KEY1"": ""somekey"",
""CATEG"": [
""cat1"",
""cat2"",
""cat3""
]
}
]
}
}";

ESObject0 globalobject = JsonConvert.DeserializeObject<ESObject0>(json);
foreach (string item in globalobject.EVTS.EVT[0].CATEG)
{
Console.WriteLine(item);
}
}
}

也许您只是向反序列化器提供了一个错误的 json 值,它看起来不像您问题中显示的那样。顺便说一句,在你的问题中显示的是无效的 JSON,因为你在 KEY1 属性声明之后缺少 ,


更新:

现在您已经展示了您的真实 JSON(来自 http://donnees.ville.quebec.qc.ca/Handler.ashx?id=69&f=JSON ),似乎有一行 CATEG 不是字符串数组而是一个简单的字符串:

""CATEG"": ""Conférence""

这是一个非常糟糕的设计,因为它们混合了数组和简单的属性。恐怕为了处理这种情况,您需要使用 JObject 并通过测试实际的底层类型来提取您需要的信息。

例如:

var obj = JObject.Parse(json);
var events = (JArray)obj["EVTS"]["EVT"];
foreach (JObject evt in events)
{
var categories = evt["CATEG"];
if (categories is JArray)
{
// you've got a list of strings so you can loop through them
string[] cats = ((JArray)categories)
.Select(x => x.Value<string>())
.ToArray();
}
else
{
// you've got a simple string
string cat = categories.Value<string>();
}
}

关于c# - json 牛顿软件 : Deserialize Object containing a list of string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22580141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com