Как я могу десериализовать эти данные JSON с JSON.Net? - PullRequest
2 голосов
/ 18 февраля 2011

Я не уверен, как определить свойство 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?

Ответы [ 4 ]

3 голосов
/ 21 февраля 2011

Если вы используете .NET 4.0, то, возможно, вы захотите использовать dynamic при работе с JSON.

Я опубликовал некоторый код, показывающий один из способов настройки для другого вопроса..

В вашем примере вы могли бы сделать:

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 голос
/ 21 февраля 2011

Хорошо - не уверен, что это лучший способ сделать это ... но ... я получил это, сделав это ...

public class Response
{
    [JsonProperty(PropertyName = "total_rows")]
    public int TotalRows { get; set; }
    public IList<MyPoco> Data { get; set; }
}

Теперь свойство data НЕ будет автоматически заполнено библиотекой 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 автоматически извлекать этот список объектов List ... но я использую Linq-To-Json и извлекаю этих плохих парней.

Не совсем доволен .. но это работает.

HTH, кто-то там в межсетях.

Теперь сделайте случайный милый мяу-рис.

enter image description here

1 голос
/ 18 февраля 2011

У вас есть строка и числа в вашем массиве. Вы должны использовать object вместо string с типом списка.

public class Response
{
    public int total_rows { get; set; }
    public IList<object> data { get; set; }
}
0 голосов
/ 19 февраля 2011

Похоже, у вас есть список списков. В этом случае оно должно быть:

public class Response
{
    public int total_rows { get; set; }
    public IList<IList<object>> data { get; set; }
}
...