将JSON反序列化为C#数组,其中索引位于属性名称中

时间:2019-06-10 11:45:43

标签: c# mongodb json.net servicestack-text

任何人都可以提供其反序列化以下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都可以。

2 个答案:

答案 0 :(得分:1)

可以使用JToken并先使用.Values(),然后再使用.ToArray()

var json = "{\r\n  \"b0\": \"ABC\",\r\n  \"b1\": \"DEF\",\r\n  \"b2\": \"GHI\",\r\n}";

var token = JToken.Parse(json);

var b = token.Values().ToArray();

答案 1 :(得分:1)

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

ViewModel

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

         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();