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

Jib*_*hew 4 c# json json.net

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

 "parent_crumbs": [
    "Platforms",
    "STATS , EXPE , ESTAP",
    "Portal"
],
Run Code Online (Sandbox Code Playgroud)

我使用下面的代码从 JSON 对象读取值

 JObject _task; //parse the JSON to JOBJECT first               
 string values=    (string)_task["parent_crumbs"].ToString();
Run Code Online (Sandbox Code Playgroud)

这将返回一个带有方括号和所有引号的字符串。

我如何将其转换为 C# 中的字符串数组

我可以删除 [ 和 ] 然后拆分 ,但是当 , 出现在字符串项中间时,整个假设将被打破。那么是否有任何方法可以从 JArray 读取字符串数组

Rui*_*mba 5

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

{
    "id": 123,
     "parent_crumbs": [
        "Platforms",
        "STATS , EXPE , ESTAP",
        "Portal"
    ]
}
Run Code Online (Sandbox Code Playgroud)

您可以创建与此结构匹配的 C# 模型,如下所示:

public class Data
{
    [JsonProperty("id")]
    public int Id { get; set; }

    [JsonProperty("parent_crumbs")]
    public List<string> ParentCrumbs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后将 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);
}
Run Code Online (Sandbox Code Playgroud)

编辑

您可以执行以下操作,而不是反序列化整个 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>>();
Run Code Online (Sandbox Code Playgroud)

  • @RuiJarimba 不要将 JToken 转换为字符串只是为了反转并反序列化它。相反,请使用 [`.ToObject&lt;T&gt;()`](https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JToken_ToObject__1.htm),如下所示:`List&lt;string&gt; crumbs = crumbsToken.ToObject&lt;List &lt;字符串&gt;&gt;();` (3认同)
  • 在反序列化时,请注意,您可以创建一个具有较少属性的模型,并且无论如何它都会起作用。 (2认同)