我不确定如何定义data
属性来反序列化以下json数据......
{
"response": {
"total_rows": 39,
"data": [
[
"XXXXXXXXXXXXXXXXXBs2VI",
"a7ac4aa7-7211-4116-be57-0c36fc2abeee",
"AAAAAA",
"Crn Burnley & Victoria St",
"Richmond",
"VIC",
"3121",
"555-555-555",
null,
"Real Estate & Home Improvement > Storage",
null,
null,
-37.8114511488511,
145.009782837163
],
[ .. ]
[ .. ]
....
},
status = "ok"
}
所以我有..
public class ResultData
{
public Response Response { get; set; }
public string Status { get; set; }
}
和....
public class Response
{
public int total_rows { get; set; }
public IList<string> data { get; set; }
}
但这是一个例外,说"Can't cast float to string"
。所以它试图将最后两个浮点数添加到List<>
..但是失败了。
我该如何解决这个问题? (我无法控制json输出。)
干杯:)
看起来data
json属性的内容是具有固定对象类型的固定大小数组。那么有没有一种方法可以定义它,在我的.NET代码中,所以JSON.NET知道如何准确反序列化它?我是否需要为该json属性创建自定义json反序列化器?
答案 0 :(得分:3)
如果您使用的是.NET 4.0,那么在处理JSON时您可能会考虑使用dynamic
。
我发布了一些代码,显示了设置on another question的一种方法。
在您的示例中,您可以这样做:
var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new DynamicJsonConverter() });
dynamic obj = serializer.Deserialize(json, typeof(object));
if (obj.status != "ok")
throw new OopsException();
int rowCount = obj.total_rows;
foreach (var row in obj.data) {
string code1 = row[0];
string code2 = row[1];
string code3 = row[2];
string address = row[3];
string suburb = row[4];
string state = row[5];
string postcode = row[6];
string phone = row[7];
string something1 = row[8];
string name = row[9];
string something2 = row[10];
string something3 = row[11];
decimal longitude = row[12];
decimal latitude = row[13];
// TODO use above values
}
答案 1 :(得分:1)
您的数组中包含字符串和数字。您必须使用object
而不是string
具有列表类型。
public class Response
{
public int total_rows { get; set; }
public IList<object> data { get; set; }
}
答案 2 :(得分:1)
好的 - 不确定这是否是最好的方法..但是......我通过这样做得到它......
public class Response
{
[JsonProperty(PropertyName = "total_rows")]
public int TotalRows { get; set; }
public IList<MyPoco> Data { get; set; }
}
现在,数据属性不会被JSON库自动填充...这是100%的罚款。
然后我这样做......
RestResponse<ResultData> response = client.Execute<ResultData>(restRequest);
ResultData data = response.Data;
if (data != null)
{
// Now the Data property will be null, so we need to parse that badboy.
JObject linqData = JObject.Parse(response.Content);
var array = linqData["response"]["data"] as JArray;
if (array != null)
{
data.Response.Data =
(from x in array
select new MyPoco
{
SubjectKey = x[0].Value<string>(),
UUid = x[1].Value<string>(),
Name = x[2].Value<string>(),
Address = x[3].Value<string>(),
City = x[4].Value<string>(),
Territory = x[5].Value<string>(),
Postcode = x[6].Value<string>(),
Telephone = x[7].Value<string>(),
Category = x[9].Value<string>(),
Website = x[10].Value<string>(),
Email = x[11].Value<string>(),
Latitude = x[12].Value<float>(),
Longitude = x[13].Value<float>()
}).ToList();
}
}
所以 - 我不让JSON库自动提取列表对象列表..但我使用了一些Linq-To-Json并提取那些坏男孩。
并不完全开心..但它确实有效。
HTH有人在互联网上。现在有一个随意的可爱喵喵图片。
答案 3 :(得分:0)
看起来你有一份清单清单。在这种情况下,它应该是:
public class Response
{
public int total_rows { get; set; }
public IList<IList<object>> data { get; set; }
}