Member 12385075 Ответов: 1

Как десериализовать json?


Привет,
Я столкнулся с проблемой десериализации json в классе c#. JSON будет вернуть по API :-
{
    "fields": [
        {
            "value": "3732",
            "order": 1,
            "name": "id",
            "type": "hidden"
        },
        {
            "maxlen": "13",
            "required": "",
            "value": "0",
            "order": 2,
            "name": "job",
            "label": "Job ",
            "type": "text"
        },
        {
            "maxlen": "13",
            "required": "",
            "value": "0",
            "order": 3,
            "name": "client",
            "label": "Client ",
            "type": "text"
        },
        {
            "maxlen": "50",
            "required": "required",
            "value": "Tim Nguyen",
            "order": 4,
            "name": "task_name",
            "label": "Task Name ",
            "type": "text"
        },
        {
            "required": "required",
            "time": "05:30 PM",
            "date": "07/18/2017",
            "order": 5,
            "name": "start_date",
            "label": "Start Date ",
            "type": "datetime"
        },
        {
            "required": "",
            "time": "07:00 PM",
            "date": "07/18/2017",
            "order": 6,
            "name": "end_date",
            "label": "End Date ",
            "type": "datetime"
        },
        {
            "required": "",
            "value": "Roof Inspection",
            "order": 7,
            "name": "task_description",
            "label": "Task Description ",
            "type": "textareainput"
        }
    ],
    "action": "update_task",
    "hidden": {},
    "display": "Update Task"
}


Пожалуйста, помогите мне решить эту проблему.

Уважение
Анкуш

Что я уже пробовал:

public class FormFillByTaskId
{
	public FieldData[] fields { get; set; }
}
public class FieldData
{
   // Don't know how to deserialize over here..
}

F-ES Sitecore

Google "c# deserialise json" - это очень хорошо документировано, много примеров, Если вы просто ищете

Graeme_Grant

Или проверьте Решение ниже... ;)

F-ES Sitecore

Дайте человеку рыбу....

Graeme_Grant

Почему только одна рыба, когда я могу дать полное ведро! ;)

Работа с JSON в C# и VB[^]

1 Ответов

Рейтинг:
11

Graeme_Grant

Существуют веб-сайты, которые будут генерировать классы для вас из данных JSON. Мой любимый: JSON Utils: генерация C#, VB.Net, SQL Table, Java и PHP из JSON[^]

Используя приведенные выше данные JSON, генерируются следующие классы:

public class Field
{

    [JsonProperty("value")]
    public string Value { get; set; }

    [JsonProperty("order")]
    public int Order { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("maxlen")]
    public string Maxlen { get; set; }

    [JsonProperty("required")]
    public string Required { get; set; }

    [JsonProperty("label")]
    public string Label { get; set; }

    [JsonProperty("time")]
    public string Time { get; set; }

    [JsonProperty("date")]
    public string Date { get; set; }
}

public class Hidden
{
}

public class Example
{

    [JsonProperty("fields")]
    public IList<Field> Fields { get; set; }

    [JsonProperty("action")]
    public string Action { get; set; }

    [JsonProperty("hidden")]
    public Hidden Hidden { get; set; }

    [JsonProperty("display")]
    public string Display { get; set; }
}

Далее вам нужно будет написать код для преобразования / сопоставления данных JSON со структурой класса. Галерея NuGet | Json.NET 10.0.3[^] используется большинством.

После ссылки в вашем проекте вот вспомогательный класс, который я использую для преобразования из / в классы:
public static class JsonConverter
{
    public static string FromClass<T>(T data, bool isEmptyToNull = false, JsonSerializerSettings jsonSettings = null)
    {
        string response = string.Empty;

        if (!EqualityComparer<T>.Default.Equals(data, default(T)))
            response = JsonConvert.SerializeObject(data, jsonSettings);

        return isEmptyToNull ? (response == "{}" ? "null" : response) : response;
    }

    public static T ToClass<T>(string data, JsonSerializerSettings jsonSettings = null)
    {
        var response = default(T);

        if (!string.IsNullOrEmpty(data))
            response = jsonSettings == null
                ? JsonConvert.DeserializeObject<T>(data)
                : JsonConvert.DeserializeObject<T>(data, jsonSettings);

        return response;
    }
}

И вот как использовать вспомогательный класс:
var rawJson = "{\"fields\": [{\"value\": \"3732\",\"order\": 1,\"name\": \"id\",\"type\": \"hidden\"},{\"maxlen\": \"13\",\"required\": \"\",\"value\": \"0\",\"order\": 2,\"name\": \"job\",\"label\": \"Job \",\"type\": \"text\"},{\"maxlen\": \"13\",\"required\": \"\",\"value\": \"0\",\"order\": 3,\"name\": \"client\",\"label\": \"Client \",\"type\": \"text\"},{\"maxlen\": \"50\",\"required\": \"required\",\"value\": \"Tim Nguyen\",\"order\": 4,\"name\": \"task_name\",\"label\": \"Task Name \",\"type\": \"text\"},{\"required\": \"required\",\"time\": \"05:30 PM\",\"date\": \"07/18/2017\",\"order\": 5,\"name\": \"start_date\",\"label\": \"Start Date \",\"type\": \"datetime\"},{\"required\": \"\",\"time\": \"07:00 PM\",\"date\": \"07/18/2017\",\"order\": 6,\"name\": \"end_date\",\"label\": \"End Date \",\"type\": \"datetime\"},{\"required\": \"\",\"value\": \"Roof Inspection\",\"order\": 7,\"name\": \"task_description\",\"label\": \"Task Description \",\"type\": \"textareainput\"}],\"action\": \"update_task\",\"hidden\": {},\"display\": \"Update Task\"}";
var result = JsonConverter.ToClass<Example>(rawJson);


BillWoodruff

+5 Очень полезная информация !

Я хотел бы предложить вам написать статью о вашей работе с Newtonsoft flavor JSON.

Кроме того, я хотел бы побудить ypu задуматься о том, является ли QA сервисом для написания кода для других людей или форумом, помогающим другим людям научиться становиться лучшими программистами, которые, возможно, смогут решить для себя более широкий круг проблем. Следует признать, что эти две "роли" (учитель, поставщик) не всегда могут быть разделены.

с уважением к вашему интеллекту, продуктивности и вашим прекрасным вкладам, Билл

Graeme_Grant

Спасибо, Билл, очень ценю. Вышесказанное выглядит как большая работа, но на самом деле у меня заняло всего минуту или две - в основном копирование и вставка. ;)

Я думал о том, чтобы написать несколько статей, просто не нашел времени. Но после вашего отзыва я посмотрю, смогу ли я найти немного времени... ;)

Graeme_Grant

Я нашел счет времени и опубликовал статью... Работа с JSON в C# и VB[^]