【问题标题】:How to iterate through the following json using c#如何使用 c# 遍历以下 json
【发布时间】:2019-03-03 05:01:32
【问题描述】:

我想从下面的 json 中得到所有的结果:

[
  {
    eventID: 1,
    name: 'Wedding',
    status: true
  },
  {
    eventID: 2,
    name: 'Baptism',
    status: true
  },
  {
    eventID: 3,
    name: 'Tour',
    status: true
  },
  {
    eventID: 4,
    name: 'Birthday',
    status: null
  }
]

我尝试使用var jObject = JObject.Parse(json); 进行解析,但出现错误。我的代码只有在 JSON 中有一组值时才有效。有人可以帮忙吗?

【问题讨论】:

  • 这是无效的 JSON
  • 将其转换为列表,然后您可以简单地使用 foreach 进行迭代
  • 尝试 var 结果 = JsonConvert.DeserializeObject(json);这里 T 是你的对象类型
  • 您的 JSON 是一个数组,而不是一个对象,所以请改用 JArray.Parse(json)

标签: c# json asp.net-web-api


【解决方案1】:

您在此处提供的 Json 无效,因此我假设您有如下所示的 json

string jsonString = "{'data':[{'eventID':1,'name': 'Wedding','status': true},{'eventID':2,'name': 'Baptism','status': true},{'eventID':2,'name': 'Birthday','status': null}]}".Replace("'", "\"");

然后你必须创建一个合适的模型来保存数据。

 public class ConvertedResult
    {
        [JsonProperty(PropertyName = "data")]
        public IEnumerable<JsonConvertSampleClass> ResultList { get; set; }
    }

    public class JsonConvertSampleClass
    {
        [JsonProperty(PropertyName = "eventID")]
        public int EventId { get; set; }
        [JsonProperty(PropertyName = "name")]
        public string Name { get; set; }
        [JsonProperty(PropertyName = "status")]
        public bool? Status { get; set; }
    }

最后是Deserialize你的Object

 var response = Newtonsoft.Json.JsonConvert.DeserializeObject<ConvertedResult>(jsonString);

因此 var 响应(ConvertedResult 的类型)将包含一个类型为 JsonConvertSampleClass 的列表,其中包含 3 个项目。

注意:不要忘记包含using Newtonsoft.Json;

问题是在发布答案后编辑的,所以,回答编辑后的问题:

      string jsonString = "[{'eventID':1,'name': 'Wedding','status': true},{'eventID':2,'name': 'Baptism','status': true},{'eventID':2,'name': 'Birthday','status': null}]".Replace("'", "\"");

   var response = Newtonsoft.Json.JsonConvert.DeserializeObject<IEnumerable<JsonConvertSampleClass>>(jsonString);

旁注:如果您不想使用JsonProperty 属性,那么您可以按照@Fram 的建议使用CamelCasePropertyNamesContractResolver

【讨论】:

  • 用户不需要所有这些 JsonProperty 属性。只需将 JsonSerializerSettings ContractResolver 更改为 Camel Case 解析器即可。他们的 OP 也不需要更改 JSON 字符串。反序列化为他们定义的任何类型的数组
  • @Fran 这是一种选择,仅此而已。这个解决方案有什么问题吗?为什么投反对票?
  • 您没有回答 OP 的问题,因为您在其有效时更改了他的 json。然后继续将 JsonProperty 属性添加到每个属性,只要简单地换出合同解析器就可以实现 OP 想要的。
  • @Fran 问题似乎是在那里编辑的,当我回答问题时,Json 无效且不正确,这就是为什么我使用提问者提供的输入创建了一个 json。请检查问题中的 cmets。后来提问者编辑了我猜的问题,现在只有我注意到了。
  • @Fran 你还在想我的回答需要投反对票吗?
【解决方案2】:

如果您关心遵守 .net 属性命名标准,您可以为您的对象定义一个类型

private class DeserializedObject
{
    public int EventId { get; set; }
    public string Name { get; set; }
    public bool? Status { get; set; }
}

然后使用Json.net,你可以使用反序列化它

var _deserializedObject = JsonConvert.DeserializeObject<DeserializedObject[]>(Data, new JsonSerializerSettings {ContractResolver = new CamelCasePropertyNamesContractResolver()});

如果您不遵循 .net 约定,

private class DeserializedObject
{
    public int eventID { get; set; }
    public string name { get; set; }
    public bool? status { get; set; }
}

并使用

对其进行反序列化
var _deserializedObject = JsonConvert.DeserializeObject<DeserializedObject[]>(Data);

你的 json 被定义为

private const string Data = "[{eventID: 1,name: 'Wedding',status: true},{eventID: 2,name: 'Baptism',status: true},{ eventID: 3,name: 'Tour',status: true},{eventID: 4,name: 'Birthday',status: null}]";

【讨论】:

    【解决方案3】:

    假设你修复了你的 Json - 这些元素需要在一个数组中(即用方括号括起来)。

    假设你有这个课程:

    public class Data 
    {
        public int EventId { get; set; }
        public string Name { get; set; }
        public bool? Status { get; set; }
    } 
    

    您可以使用 Json.Net 反序列化您的 Json:

    var data = JsonConvert.DeserializeObject<IEnumerable<Data>>(json);
    

    【讨论】:

      猜你喜欢
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      相关资源
      最近更新 更多