Десериализовать объект Json, содержащий подчиненный массив - PullRequest
1 голос
/ 24 апреля 2011

У меня есть следующая строка Json (содержащая subArray):

{ "атрибуты": [{ "Имя": "а", "данные": [ "10", "0", "50"], "dataName": [ "2000248", "2789290", "2789291"], "DataValue": [ "а", "б", "в"], "toClick": "г"}, { "Имя": "V", "данные": [ "0", "0", "0", "20"] "DataName": [ "49500000", "49500001", "49500002", "49500003"], "DataValue": [ "а", "V", "V", "г"], "toClick": "г"}]} "

Я не могу десериализовать в csharp. [Обновлено после комментария] Что я сделал:

public class attributes
{
    public string name { get; set; }
    public string[] data { get; set; }
    public string[] dataName { get; set; }
    public string[] dataValue { get; set; }
    public string toClick { get; set; }
}


public class DataJsonAttributeContainer
{
    public List<attributes> JsonAttributeAfterSaves { get; set; }
}

public static T DeserializeFromJson<T>(string json)
{
    T deserializedProduct = JsonConvert.DeserializeObject<T>(json, settings);
    return deserializedProduct;
}

private void testJson()
{
    string JsonStr =
        "{\"attributes\":[{\"name\":\"a\",\"data\":[\"10\",\"0\",\"50\"],\"dataName\":[\"2000248\",\"2789290\",\"2789291\"],\"dataValue\":[\"a\",\"a\",\"d\"],\"toClick\":\"d\"},{\"name\":\"d\",\"data\":[\"0\",\"0\",\"0\",\"20\"],\"dataName\":[\"49500000\",\"49500001\",\"49500002\",\"49500003\"],\"dataValue\":[\"a\",\"a\",\"d\",\"d\"],\"toClick\":\"a\"}]}";
    var container = DeserializeFromJson<DataJsonAttributeContainer>(JsonStr);
}

Метод испытания:

testJson()

Что я могу сделать?

Ответы [ 2 ]

2 голосов
/ 24 апреля 2011

Ваша собственность в DataJsonAttributeContainer имеет неправильное имя, указанное в JSON. Вот пример, который работает, насколько я могу судить:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

public class Attributes
{
    public string name { get; set; }
    public string[] data { get; set; }
    public string[] dataName { get; set; }
    public string[] dataValue { get; set; }
    public string toClick { get; set; }
}


public class DataJsonAttributeContainer
{
    public List<Attributes> attributes { get; set; }
}

class Test
{

    public static T DeserializeFromJson<T>(string json)
    {
        T deserializedProduct = JsonConvert.DeserializeObject<T>(json);
        return deserializedProduct;
    }

    static void Main()
    {
        string JsonStr =
            "{\"attributes\":[{\"name\":\"a\",\"data\":[\"10\",\"0\",\"50\"],\"dataName\":[\"2000248\",\"2789290\",\"2789291\"],\"dataValue\":[\"a\",\"a\",\"d\"],\"toClick\":\"d\"},{\"name\":\"d\",\"data\":[\"0\",\"0\",\"0\",\"20\"],\"dataName\":[\"49500000\",\"49500001\",\"49500002\",\"49500003\"],\"dataValue\":[\"a\",\"a\",\"d\",\"d\"],\"toClick\":\"a\"}]}";
        var container = DeserializeFromJson<DataJsonAttributeContainer>(JsonStr);
        Console.WriteLine(container.attributes.Count); // Prints 2
        Console.WriteLine(container.attributes[0].data.Length); // Prints 3
    }
}
0 голосов
/ 24 апреля 2011

Вы должны указать правильные типы и, в случае вашего DataJsonAttributeContainer, также правильное имя свойства:

public class attributes
{
    public string name { get; set; }
    public int[] data { get; set; }
    public int[] dataName { get; set; }
    public string[] dataValue { get; set; }
    public string toClick { get; set; }
}

public class DataJsonAttributeContainer
{
    public List<attributes> attributes { get; set; }
}

С предыдущими определениями у меня работает следующее (после того, как я удалил последний " из вашей строки JSON):

var data = JsonConvert.DeserializeObject<DataJsonAttributeContainer>(jsonString);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...