首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用不同的键反序列化JSON文件

用不同的键反序列化JSON文件
EN

Stack Overflow用户
提问于 2020-08-17 07:46:35
回答 3查看 190关注 0票数 0

我有一个像这样的儿子:

代码语言:javascript
复制
[
    { "Province1" : [
            { "name" : "city-1" },
            { "name" : "city-2" }
        ]
    },
    { "Province2" : [
            { "name" : "city-1" },
            { "name" : "city-2" }
        ]
    }
]

我想使用NewtonsoftJson反序列化它。我试过了,但是结果是空的:

代码语言:javascript
复制
public class City {
    public string Name { get; set; }
}

var cities = JsonConvert.DeserializeObject<IEnumerable<KeyValuePair<string, List<City>>>(File.ReadAllText(@"jsonPath"));

我应该如何将它去写成一个类呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-17 08:26:07

在稍微修改了一下之后,我想出了一个反序列化的结构

代码语言:javascript
复制
class MyDeserializer
{
    public static void Deserialize()
    {
        var json = "[{\"Province1\" : [{\"name\" : \"city-1\" }, {\"name\" : \"city-2\" }] }, {\"Province2\" : [{ \"name\" : \"city-1\" }, { \"name\" : \"city-2\" }] } ]";

        var cities = JsonConvert.DeserializeObject<List<Dictionary<string, List<City>>>>(json);

        Console.WriteLine(cities[0]["Province1"][0].Name);
    }
}

class City
{
    [JsonProperty(PropertyName = "name")]
    public string Name { get; set; }
}

这给了每个省一本字典,这似乎有点不直观。但这就是JSON的结构方式。如果你想把所有的字典合并成一个,你可以这样做

代码语言:javascript
复制
    var cities = JsonConvert.DeserializeObject<List<Dictionary<string, List<City>>>>(json).SelectMany(dict => dict).ToDictionary(pair => pair.Key, pair => pair.Value);
    Console.WriteLine(cities["Province1"][0].Name);
票数 3
EN

Stack Overflow用户

发布于 2020-08-17 08:08:21

我觉得你的结构应该是这样的

代码语言:javascript
复制
[
    { "Name": "Province1",
        "Cities": [
            { "name": "city-1" },
            { "name": "city-2" }
        ]
    },
    { "Name": "Province2",
        "Cities": [
            { "name": "city-1" },
            { "name": "city-2" }
        ]
    }
]

并使之值得:

代码语言:javascript
复制
namespace ConsoleApp2 {
    public class Province {
        public string Name { get; set; }
        public List<City> Cities { get; set; }
    }

    public class City {
        public string Name { get; set; }
    }

    public class ConsoleApp2 {
        public static void Main(string[] args) {
            List<Province> provinces = JsonConvert.DeserializeObject<List<Province>>(File.ReadAllText("province.json"));
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2020-08-17 08:43:11

对此,可能有一个更优雅的解决方案,但是这将为您提供一个带有城市名称Dictionary<string,string[]>数组的省名字典。

代码语言:javascript
复制
var dict = JArray
        .Parse(input)
        .Cast<JObject>()
        .Select(x => x.Properties().First())
        .ToDictionary(
           x => x.Name, 
           x => x.Values().Values().Select(x => x.First.ToString()).ToArray());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63446657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档