首页 > 解决方案 > 将 JSON 反序列化为 C# 数组,其中 index 在属性名称中

问题描述

谁能提供他们反序列化以下 JSON 的方法

{
  "i": 5
  "b0": "ABC",
  "b1": "DEF",
  "b2": "GHI",
  "s0": "SABC",
  "s1": "SDEF",
  "s2": "SGHI",
}

进入 C# 中的类以提供与此相同的结构

class Example {
    public int Index {get;set;}
    public string[] B {get;set;}
    public string[] S {get;set;}
}

var b = new [] {"ABC", "DEF", "GHI"}
var s = new [] {"SABC", "SDEF", "SGHI"}

我通常使用 ServiceStack.Text,但 Json.Net 方法甚至来自 MongoDb 提供商的 BsonDocument 都可以。

标签: c#mongodbjson.netservicestack-text

解决方案


这个解决方案也可能有用:

         public class Example
          {
            public int Index { get; set; }
            public string[] B { get; set; }
            public string[] S { get; set; }
          }   

               var strData = @"{'i': 5, 'b0': 'ABC','b1': 'DEF', 'b2': 'GHI', 's0': 'SABC', 's1': 'SDEF', 's2': 'SGHI',}";
               var data = JsonConvert.DeserializeObject<JToken>(strData).Values().ToList();
               Example result = new Example();
               result.Index = data.Values().FirstOrDefault(x => x.Path == "i").Value<int>();
                result.B = data.Values().Where(x => x.Path.StartsWith("b")).Select(x => x.Value<string>()).ToArray();
                result.S = data.Values().Where(x => x.Path.StartsWith("s")).Select(x => x.Value<string>()).ToArray();

数组的动态名称有解决方案,但在这种情况下字符串数组不是最好的类型:

   public class Example
    {
        public int Index { get; set; }
        public Dictionary<string, string[]> Data { set; get; }
    }


            var s = @"{'i': 5, 'b0': 'ABC','b1': 'DEF', 'b2': 'GHI', 's0': 'SABC', 's1': 'SDEF', 's2': 'SGHI',}";
           var data = JsonConvert.DeserializeObject<JToken>(s).Values().ToList();
            Example result = new Example();
            result.Index = data.Values().FirstOrDefault(x => x.Path == "i").Value<int>();
            result.Data = new Dictionary<string, string[]>();
            var stringData = data.Values().Where(x => x.Path != "i").ToList();

            stringData.ForEach(x =>
            {
                var key = x.Path[0].ToString();
                if (!result.Data.ContainsKey(key))
                {
                    result.Data.Add(key,  new string[0]);
                }

                var currentValue = result.Data[key].ToList();
                currentValue.Add(x.Value<string>());
                result.Data[key] = currentValue.ToArray();
             });

推荐阅读