Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.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# 使用特定属性反序列化JSON_C#_Json_Json.net - Fatal编程技术网

C# 使用特定属性反序列化JSON

C# 使用特定属性反序列化JSON,c#,json,json.net,C#,Json,Json.net,我正在尝试反序列化JSON,而不在C#中声明每个属性。以下是JSON的精简摘录: { "resourceType": "export", "type": "search", "total": 50, "timestamp": "2020-08-02T18:26:06.747+00:00", "entry&qu

我正在尝试反序列化JSON,而不在C#中声明每个属性。以下是JSON的精简摘录:

{
    "resourceType": "export",
    "type": "search",
    "total": 50,
    "timestamp": "2020-08-02T18:26:06.747+00:00",
    "entry": [
        {
            "url": "test.com/123",
            "resource": {
                "resourceType": "Slot",
                "id": [
                    "123"
                ],
                
                "schedule": {
                    "reference": {
                        "value": "testvalue"
                    }
                },
                "status": "free",
                "start": "2020-08-03T08:30+01:00",
                "end": "2020-08-03T09:00+01:00"
            }
        }
   ]
}
我想从
条目中获取值→ <代码>资源
id
开始


关于最好的方法有什么建议吗?

我不知道你为什么不反序列化这个部分(即使它的填充量最小),因为你无论如何都要做内部类

下面是通过深入挖掘
JObjects

给定的

public class Reference  
{
   public string value { get; set; } 
}

public class Schedule   
{
   public Reference reference { get; set; } 
}

public class Resource  
{
   public string resourceType { get; set; } 
   public List<string> id { get; set; } 
   public Schedule schedule { get; set; } 
   public string status { get; set; } 
   public string start { get; set; } 
   public string end { get; set; } 
}

public class Entry
{
   public string url { get; set; } 
   public Resource resource { get; set; } 
}
公共类参考
{
公共字符串值{get;set;}
}
公课时间表
{
公共引用{get;set;}
}
公共类资源
{
公共字符串resourceType{get;set;}
公共列表id{get;set;}
公共时间表{get;set;}
公共字符串状态{get;set;}
公共字符串开始{get;set;}
公共字符串结束{get;set;}
}
公开课入学
{
公共字符串url{get;set;}
公共资源资源{get;set;}
}
你可以打电话

var results = JObject.Parse(input)["entry"]
                     .Select(x => x.ToObject<Entry>());
var results=JObject.Parse(输入)[“条目”]
.Select(x=>x.ToObject());

我在这方面有很好的经验。您可以在那里输入JSON数据,它将生成反序列化JSON数据所需的类

public class Reference    
{
    public string value { get; set; } 
}

public class Schedule    
{
    public Reference reference { get; set; } 
}

public class Resource    
{
    public string resourceType { get; set; } 
    public List<string> id { get; set; } 
    public Schedule schedule { get; set; } 
    public string status { get; set; } 
    public string start { get; set; } 
    public string end { get; set; } 
}

public class Entry    
{
    public string url { get; set; } 
    public Resource resource { get; set; } 
}

public class Root    
{
    public string resourceType { get; set; } 
    public string type { get; set; } 
    public int total { get; set; } 
    public DateTime timestamp { get; set; } 
    public List<Entry> entry { get; set; } 
}
公共类参考
{
公共字符串值{get;set;}
}
公课时间表
{
公共引用{get;set;}
}
公共类资源
{
公共字符串resourceType{get;set;}
公共列表id{get;set;}
公共时间表{get;set;}
公共字符串状态{get;set;}
公共字符串开始{get;set;}
公共字符串结束{get;set;}
}
公开课入学
{
公共字符串url{get;set;}
公共资源资源{get;set;}
}
公共类根
{
公共字符串resourceType{get;set;}
公共字符串类型{get;set;}
公共整数总计{get;set;}
公共日期时间时间戳{get;set;}
公共列表项{get;set;}
}
下一步是选择一个有助于反序列化的框架。差不多

Root myDeserializedClass=JsonConvert.DeserializeObject(myJsonResponse);

如果希望在不声明类的情况下获取数据,可以使用Json.Net(JToken、JObject等)。您可以将该方法与表达式一起使用,以在几行中获得所需的内容。请注意,
是递归下降运算符

JObject obj = JObject.Parse(json);
List<string> ids = obj.SelectToken("..resource.id").ToObject<List<string>>();
DateTimeOffset start = obj.SelectToken("..resource.start").ToObject<DateTimeOffset>();

演示:

只在C#模型中创建所需的属性。“在C#模型中不声明每个属性”,听起来就像手动键入变量名。这是一个简单的复制过去。可以使用联机工具,如,或直接在visual studio中使用简单的特殊过去。对于部分反序列化,您会发现许多基于我有一个属性的示例,如:“div”:“这会导致转换问题。什么问题?如果抛出任何异常,您可以将其发布给我吗?您是否确保有一个有效的json格式?它看起来像json2sharp上的额外“”案例问题。但是,如果我只使用这个属性,也许就可以了?如果你发布整个代码,包括这个属性,我可以尝试进一步帮助你。根据JSON格式,JSON中有“div”:“”是完全有效的。只是json2sharp抱怨代码没有问题。
JObject obj = JObject.Parse(json);
List<string> ids = obj.SelectToken("..resource.id").ToObject<List<string>>();
DateTimeOffset start = obj.SelectToken("..resource.start").ToObject<DateTimeOffset>();
JObject obj = JObject.Parse(json);
var items = obj["entry"]
    .Children<JObject>()
    .Select(o => new 
    {
        ids = o.SelectToken("resource.id").ToObject<List<string>>(),
        start = o.SelectToken("resource.start").ToObject<DateTimeOffset>()
    })
    .ToList();