如何从JSON动态内容读取到对象中?

问题描述 投票:0回答:2

我需要在包含动态值范围配置的json文件bands中定义。它们将来可能会改变,所以我希望它看起来像这样:

"Bands": {
    "5-15": [ 5000, 15000 ],
    "15-30": [ 15000, 30000 ],
    "30-45": [ 30000, 45000 ],
    "45-60": [ 45000, 60000 ],
    "60-100": [ 60000, 100000 ]
}

是否可以读取此json格式并将其存储在对象中?

我尝试过:

public class BandsMapping
{
    public List<Bands> Bands { get; set; }
}

public class Bands
{
    public string Name { get; set; }
    public List<int> ValueRanges { get; set; }
}

但是失败,因为json文件中既没有Name也没有ValueRanges。但是我希望json文件看起来像这样。

关于如何实现该目标的任何想法?

c# json
2个回答
0
投票

您应该将Dictionary<string, List<int>>Dictionary<string, int[]>用于Bands内容

public class BandsMapping
{
    public Dictionary<string, List<int>> Bands { get; set; }
}

字典键代表具有范围的string,字典值是一个数组或整数值列表。您还可以使用Bands

将字典轻松转换为Select项目列表
var result = JsonConvert.DeserializeObject<BandsMapping>(jsonString);
var bandsList = result.Bands
    .Select(kvp => new Bands { Name = kvp.Key, ValueRanges = kvp.Value })
    .ToList();

0
投票

以下代码将使您能够根据需要将JSON字符串转换为.NET对象

using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Linq;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var json = @"
        {
            ""Bands"": {
                ""5-15"": [ 5000, 15000 ],
                ""15-30"": [ 15000, 30000 ],
                ""30-45"": [ 30000, 45000 ],
                ""45-60"": [ 45000, 60000 ],
                ""60-100"": [ 60000, 100000 ]
            }
        }";

        var bandsMapping = new BandsMapping();
        bandsMapping.Bands = JsonConvert.DeserializeObject<JObject>(json)["Bands"].Children().Select(x =>
        {
            var band = (JProperty)x;
            return new Band() {
                Name = band.Name, 
                ValueRanges = (List<int>)band.Value.ToObject(typeof(List<int>))
            };
        }).ToList();

        // pretty print the JSON of your new .NET object
        Console.Write(JsonConvert.SerializeObject(bandsMapping, Formatting.Indented));
    }
}

public class BandsMapping
{
    public List<Band> Bands { get; set; }
}

public class Band
{
    public string Name { get; set; }
    public List<int> ValueRanges { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.