如何在c#中解析双列表JSON数据

时间:2015-04-10 07:11:22

标签: c# json asp.net-mvc web-services

我通过调用格式为:

的服务来获取JSON数据
[
  [
    {
      "AgentStatus": "- Active",
      "Basement": "None",
      "BasementType": "",
      "Baths": "4",
      "BathsHalf": "1",
      "Beds": "6"
    },
    [
      "372010-1.jpg"
    ]
  ],
  [
    {
      "AgentStatus": "- Active",
      "Basement": "Finished,Full",
      "BasementType": "FULL FINISHED",
      "Baths": "2",
      "BathsHalf": "1",
      "Beds": "3"
    },
    [
      "377388-1.jpg",
      "377388-2.jpg",
      "377388-12.jpg"
    ]
  ]
]

要解析这个JSON我做的类如:

public class RetsProperty
{
    public PropertyAttributes PropAttributes { get; set; }

    public string[] ImgUrls { get; set; }
}

public class PropertyAttributes
{
    public string AgentStatus { get; set; }

    public string Basement { get; set; }

    public string BasementType { get; set; }

    public string Baths { get; set; }

    public string BathsHalf { get; set; }

    public string Beds { get; set; }
}

我已经使用Newtonsoft Json反序列化JSON数据

var retsPropertyItems = Newtonsoft.Json.JsonConvert.DeserializeObject<List<RetsProperty>>(propertyJsonString);

但它无法解析它返回错误:

enter image description here

我认为这是因为我无法正确创建课程。

那我该如何格式化我的课程呢? 或者是否可以按照我的方式进行映射?

由于

2 个答案:

答案 0 :(得分:2)

你的格式很糟糕 JSON 因为它在没有属性名称的数组中有数组。所以你应该仔细解析它。

我想出了一个可能不那么糟糕且易于理解的解决方案(如果我理解你的 JSON 格式)。我们的想法是用您的 JSON 包装属性名称,然后解析他的构造。

您应该以相同的方式包装 JSON

var wrappedText = @"{ ""Prop"": " + propertyJsonString + " }";

然后你可以用 Newtonsoft Json

解析
var jsonData = JObject.Parse(wrappedText);

现在您拥有 JSON 数据,您应该手动解析它。我建议你这样:

List<RetsProperty> RetsProperties = new List<RetsProperty>();
foreach (var prop in jsonData["Prop"])
{
    RetsProperties.Add(new RetsProperty
        {
            ImgUrls = Newtonsoft.Json.JsonConvert.DeserializeObject<string[]>(prop.Last.ToString()),
            PropAttributes = Newtonsoft.Json.JsonConvert.DeserializeObject<PropertyAttributes>(prop.First.ToString())
        });
};

您应该明白,只有在最后一个数组中有2个数组项时,才会起作用。请查看prop.Firstprop.Last

答案 1 :(得分:2)

首先,你有一个非常奇怪的JSON,但正如你所说,你从外部服务收到它。您可以使用JArrayLINQ来解析此类JSON,但当然这种方法非常依赖于JSON的结构。

var retsProperties = JArray.Parse(json)
    .Select(item => new RetsProperty
    {
        PropAttributes = item.First.ToObject<PropertyAttributes>(),
        ImgUrls = item.Last.ToObject<string[]>()
    })
    .ToList();