【问题标题】:How can I convert JToken to string[]?如何将 JToken 转换为字符串 []?
【发布时间】:2020-04-30 22:25:31
【问题描述】:

我正在尝试将 JObject 中的数组读入字符串 [],但我不知道如何操作。

代码非常简单,如下所示,但不起作用。失败并出现错误无法将 JToken 转换为 string[]

JObject Items = jsonSerializer.Deserialize<JObject>(jtr);
string[] brands = null;
brands = (string[])Items.SelectToken("Documents[0].Brands");

当我想读取一个简单的布尔值时,以下方法有效,所以我知道我在正确的地方。

IsAdmin = (bool)Items.SelectToken("Documents[0].IsAdmin");

Documents[0] 中的 JObject 如下所示

{
    "id": "961AA6A6-F372-ZZZZ-1270-ZZZZZ",
    "ApiKey": "SDKTest",
    "ConsumerName": "SDKTest",
    "IsAdmin": false,
    "Brands": [
        "ZZZ"
    ],
    "IsSdkUser": true
}

如何将 Brands 数组读入我的 string[] 品牌?

【问题讨论】:

    标签: c# arrays json json.net


    【解决方案1】:

    您可以使用JToken.ToObject&lt;T&gt;()JToken 反序列化为任何兼容的.Net 类型,即

    var brands = Items.SelectToken("Documents[0].Brands")?.ToObject<string []>();
    

    JToken 上的转换操作(例如 (bool)Items.SelectToken("Documents[0].IsAdmin"))仅适用于 Newtonsoft 为其提供显式或隐式转换运算符的原始类型,所有这些都记录在 JToken Type Conversions 中。由于没有为string[] 实现这样的转换运算符,因此需要进行反序列化。

    演示小提琴here.

    【讨论】:

      【解决方案2】:

      您可以使用.Values&lt;T&gt; 检索JToken 的值并将它们转换为所需的类型。

      var brands = Items["Documents"][0]["Brands"].Values<string>().ToArray();
      

      【讨论】:

        【解决方案3】:
        1. 使用this tool 或VS Edit &gt; Paste Special &gt; Paste JSON As Classes 从下面的json 创建C# 类。
        2. 安装Newtonsoft.Json Nuget 包
        3. 使用JsonConvert.DeserializeObject 将json 反序列化为C# 类。
        4. root 对象现在包含您想要的一切!

        文件.json

        {
          "Documents": [
            {
              "id": "961AA6A6-F372-ZZZZ-1270-ZZZZZ",
              "ApiKey": "SDKTest",
              "ConsumerName": "SDKTest",
              "IsAdmin": false,
              "Brands": [
                "ZZZ"
              ],
              "IsSdkUser": true
            }
          ]
        }
        

        程序.cs

        using System.IO;
        using Newtonsoft.Json;
        
        public class Program
        {
            static void Main(string[] args)
            {
                using (StreamReader r = new StreamReader(@"file.json"))
                {
                    string json = r.ReadToEnd();
                    var root = JsonConvert.DeserializeObject<RootObject>(json);
                    var brands = root.Documents[0].Brands; // brands = {"ZZZ"}
                }
            }
        }
        
        public class RootObject
        {
            public Document[] Documents { get; set; }
        }
        
        public class Document
        {
            [JsonProperty("id")]
            public string Id { get; set; }
            public string ApiKey { get; set; }
            public string ConsumerName { get; set; }
            public bool IsAdmin { get; set; }
            public string[] Brands { get; set; }
            public bool IsSdkUser { get; set; }
        }
        

        【讨论】:

          【解决方案4】:
          public static T[] JTokenToArray<T>(JToken jToken)
          {
              List<T> ret = new List<T>();
              foreach (JToken jItem in jToken)
                  ret.Add(jItem.Value<T>());
              return ret.ToArray();
          }
          

          用法:

          string[] brands = JTokenToArray&lt;string&gt;(jObject.Value&lt;JToken&gt;("brands"));

          【讨论】:

            猜你喜欢
            • 2021-12-25
            • 1970-01-01
            • 2012-08-09
            • 1970-01-01
            • 1970-01-01
            • 2011-12-31
            • 2018-04-30
            相关资源
            最近更新 更多