在C#中将JObject的JArray字符串转换为字符串数组

4

我有一个JSON,其中一部分包含字符串值,例如

 "parent_crumbs": [
    "Platforms",
    "STATS , EXPE , ESTAP",
    "Portal"
],

我使用以下代码从JSON对象中读取值。
 JObject _task; //parse the JSON to JOBJECT first               
 string values=    (string)_task["parent_crumbs"].ToString();

这将返回一个只有方括号和引号的字符串。
如何在C#中将其转换为字符串数组?
我可以先去除方括号,然后以逗号分隔。但是,如果逗号出现在字符串项的中间,整个假设都会被破坏。因此,是否有从JArray读取到String Array的方法可用?

你使用的是哪个版本的json.net/Newtonsoft.Json? - Nikolaus
最新版本来自NUGET。 - Sebastian
1
尝试使用以下代码:IEnumerable<string> strings = _task["parent_crumbs"].Select(s => s.Value<string>()); - Nikolaus
你能解决你的问题吗? - Nikolaus
1个回答

5

您没有发布完整的JSON字符串,所以让我们假设它是这样的:

{
    "id": 123,
     "parent_crumbs": [
        "Platforms",
        "STATS , EXPE , ESTAP",
        "Portal"
    ]
}

您可以创建一个符合以下结构的C#模型,如下所示:
public class Data
{
    [JsonProperty("id")]
    public int Id { get; set; }

    [JsonProperty("parent_crumbs")]
    public List<string> ParentCrumbs { get; set; }
}

然后将JSON字符串反序列化为Data类的实例:

string json = @"{
    ""id"": 123,
     ""parent_crumbs"": [
        ""Platforms"",
        ""STATS , EXPE , ESTAP"",
        ""Portal""
    ]
}";

Data data = JsonConvert.DeserializeObject<Data>(json);

foreach (string crumb in data.ParentCrumbs)
{
    Console.WriteLine(crumb);
}

编辑

您可以使用以下方法代替对整个json字符串进行反序列化:

string json = @"{
    ""id"": 123,
     ""parent_crumbs"": [
        ""Platforms"",
        ""STATS , EXPE , ESTAP"",
        ""Portal""
    ]
}";

JObject data = JObject.Parse(json);
JToken crumbsToken = data.GetValue("parent_crumbs");
List<string> crumbs = JsonConvert.DeserializeObject<List<string>>(crumbsToken.ToString());

// alternative way to get the string values, as suggested by @BrianRogers
List<string> crumbs = crumbsToken.ToObject<List<string>>();

这是一个非常长的JSON,对于我来说构建所有属性的模型并不实际。我必须制作大约60个以上的属性。这就是为什么我正在进行内联转换为字符串或JArray的原因。 - Sebastian
@JibinMathew,我在我的回答中添加了更多细节,请看一下。 - Rui Jarimba
2
在反序列化时,请注意您可以创建一个具有较少属性的模型,它仍然可以正常工作。 - SandRock
@SandRock,太酷了,我从未尝试过 - 谢谢你的信息 :-) - Rui Jarimba
3
不要将JToken转换为字符串,然后再将其反序列化。相反,使用.ToObject<T>()方法,像这样:List<string> crumbs = crumbsToken.ToObject<List<string>>(); - Brian Rogers
@BrianRogers 我已经编辑了我的答案,感谢您的反馈 :-) - Rui Jarimba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接