Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何反序列化一个对象,并将其作为';s值_C#_Json_Json.net - Fatal编程技术网

C# 如何反序列化一个对象,并将其作为';s值

C# 如何反序列化一个对象,并将其作为';s值,c#,json,json.net,C#,Json,Json.net,我陷入困境。我找不到如何反序列化这个json。我在网上找到的所有内容都是关于如何处理键/值,其中值是类型而不是对象。在这种情况下,值是一个对象,其中包含其他键/值 此外,您在“Territions”后面看到的类似guid的长字符串永远不会是相同的 如何使用JSON.NET反序列化此文件?我希望能够得到身份证和名字 谢谢你阅读这篇文章 { "territories":{ "6368e494-c47c-4678-89de-45f3bfc35247":{ "id":"6368e

我陷入困境。我找不到如何反序列化这个json。我在网上找到的所有内容都是关于如何处理键/值,其中值是类型而不是对象。在这种情况下,值是一个对象,其中包含其他键/值

此外,您在“Territions”后面看到的类似guid的长字符串永远不会是相同的

如何使用JSON.NET反序列化此文件?我希望能够得到身份证和名字

谢谢你阅读这篇文章

{
  "territories":{
    "6368e494-c47c-4678-89de-45f3bfc35247":{
      "id":"6368e494-c47c-4678-89de-45f3bfc35247",
      "name":"Atlanta Camera Operations",
      "center":[
        33748995,
        -84387983
      ],
      "timeZoneCode":"America/New_York",
      "languageCode":"en"
    },
    "4d998d4c-fcc6-4fdc-9e73-3f2e7515ee47":{
      "id":"4d998d4c-fcc6-4fdc-9e73-3f2e7515ee47",
      "name":"Atlanta Operations",
      "center":[
        33748995,
        -84387983
      ],
      "timeZoneCode":"America/New_York",
      "languageCode":"en"
    }
  }
}

您的json数据结构无效,应如下所示:

{
"territories": 
[
    {
        "id": "6368e494-c47c-4678-89de-45f3bfc35247",
        "name": "Atlanta Camera Operations",
        "center": [
            33748995, -84387983
        ],
        "timeZoneCode": "America/New_York",
        "languageCode": "en"
       }
       ,
       {
        "id": "4d998d4c-fcc6-4fdc-9e73-3f2e7515ee47",
        "name": "Atlanta Operations",
        "center": [
            33748995, -84387983
        ],
        "timeZoneCode": "America/New_York",
        "languageCode": "en"
    }
]

}
您可以映射到Territory类,这意味着:

    public class Territory
{
    public GUID id { get; set; }
    public string name { get; set; }
    public List<int> center { get; set; }
    public string timeZoneCode { get; set; }
    public string languageCode { get; set; }
}
公共类领域
{
公共GUID id{get;set;}
公共字符串名称{get;set;}
公共列表中心{get;set;}
公共字符串时区代码{get;set;}
公共字符串语言代码{get;set;}
}
并使用以下命令反序列化:

JsonConvert.DeserializeObject<List<Territory>>(your_json)
JsonConvert.DeserializeObject(您的\u json)

这里有一个类将保存区域信息:

class Territory
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("center")]
    public IList<int> Center { get; set; }

    [JsonProperty("timeZoneCode")]
    public string TimeZoneCode { get; set; }

    [JsonProperty("languageCode")]
    public string LanguageCode { get; set; }
}
我们循环遍历子项并反序列化它们:

var territoriesList = new List<Territory>();
foreach (var child in territoriesToken.Children())
{
    var territory = child.First.ToObject<Territory>();
    territoriesList.Add(territory);
}

根据我使用JSON.Net的经验,这是开箱即用的,不是吗?如果C#中的类具有相同的结构,那么Territions是一个对象属性。我看到的问题是guid被分配了一个对象?是否假定将其序列化为guid?或者是一个财产名称?如果假设它是那样序列化的,那么您需要做一个自定义格式化程序并将其传递到JSON.Net。您的代码是否也生成了这个JSON,或者只是希望它使用它?如果您有一个对象的属性
territions
恰好是
Dictionary
,那么这应该可以工作。假设
Territory
具有所概述的所有属性,我已经尝试了几种不同的方法来实现这一点。首先,我尝试使用JsonConvert.DeserializeObject(),然后尝试使用JObject.Parse()。我试着将结果放入一个动态和一个作业对象中。这个JSON是不是由您生成的?因为如果你是的话,它会错误地序列化它。如果没有,则需要编写CustomFormatter来处理not-a-property-name字段。@Skintkingle它来自API。我会调查CustomFormatter。有什么建议吗?遗憾的是,JSON来自API。我和我团队中的其他几个开发人员试图让公司注意到这一点,但失败了好几次。他的JSON是有效的。请纠正我,为什么它是有效的?根据它不是!我可以使用一个简单的territoriesToken.Count来获取对象中GUID的数量吗?@Demaly是的,你可以使用它。完美的答案!多谢各位@Nesreddine@Demarily没问题。快乐编码:)
var territoriesList = new List<Territory>();
foreach (var child in territoriesToken.Children())
{
    var territory = child.First.ToObject<Territory>();
    territoriesList.Add(territory);
}
var territoriesList = territoriesToken.Children()
                      .Select(child => child.First.ToObject<Territory>())
                      .ToList();
territoriesList[0].Id
territoriesList[0].Name