JoshWigley Ответов: 3

Как сделать цикл через объект JSON (все, что я пробовал до сих пор, потерпело неудачу).


Привет,

Я чувствую, что это невероятно простая проблема для решения, но я просто не могу заставить свой код работать!

Все, что я пытаюсь сделать, - это выполнить цикл через объект JSON и опубликовать соответствующие элементы объекта на моей веб-странице MVC.

Вот мой код ниже (я сохранил его очень простым только для того, чтобы я мог получить основы правильно в первый раз)

Тем не менее, я продолжаю получать следующее сообщение об ошибке: Newtonsoft.В формате JSON.В LINQ.JProperty' не содержит определения для 'alertName".

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

Любая помощь будет очень признательна.

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

Код Контроллера:


var jsonClient = new WebClient();
            jsonClient.Credentials = new NetworkCredential("XXXX", "XXXX");
            jsonClient.Headers.Set("Content-Type", "application/json");
            jsonClient.Headers.Set("Accept", "application/json");
            var alertsSettings = jsonClient.DownloadString("http://XXXXX:XXXX/api/alerts/settings");

            dynamic alertObj = JsonConvert.DeserializeObject(alertsSettings);

            foreach (var item in alertObj)
            {
                Viewbag.Test123 = item.alertName;
            }


типовой кодекс:

public class AlertObject
    {
        public string alertName { get; set; }
        public string value { get; set; }
        public string alertMnemonic { get; set; }
        public string enabled { get; set; }
        public string unit { get; set; }
        public string warning { get; set; }
        public string sharedParam { get; set; }
        public string type { get; set; }
        public string id { get; set; }

    }


Это и есть JSON:

{
    "data": [
        {
            "id": 268500993,
            "alertName": "High CPU Usage",
            "alertMnemonic": "HIGH_CPU_USAGE",
            "enabled": true,
            "parameters": {
                "alarm": {
                    "unit": "MINUTES",
                    "value": 15
                },
                "warning": {
                    "unit": "MINUTES",
                    "value": 5
                },
                "sharedParam": {
                    "unit": "CPU",
                    "value": 70,
                    "name": "CPU Usage"
                },
                "type": "TERNARY"
            }
        },
        {
            "id": 134479876,
            "alertName": "Custom Module Changed",
            "alertMnemonic": "CUSTOM_MODULE_CHANGED",
            "enabled": false,
            "parameters": null
        },
        {
            "id": 268500992,
            "alertName": "Low JVM Memory",
            "alertMnemonic": "LOW_AVAILABLE_JVM_MEMORY",
            "enabled": true,
            "parameters": {
                "alarm": {
                    "unit": "MEMORY",
                    "value": 64
                },
                "warning": {
                    "unit": "MEMORY",
                    "value": 128
                },
                "sharedParam": {
                    "unit": "MINUTES",
                    "value": 5,
                    "name": "Time"
                },
                "type": "TERNARY"
            }
        }
	],
    "error": null
}

3 Ответов

Рейтинг:
22

Graeme_Grant

Это похоже на другие вопросы, которые задаются здесь относительно десериализации данных JSON. Я написал статью, которая описывает инструменты и способы декодирования различных типов данных JSON: Работа с JSON в C# и VB[^]

Чтобы помочь вам на правильном пути, я взял ваши необработанные данные JSON и создал классы с помощью JSON Utils[^] и он дал мне это:

public class Alarm
{
    [JsonProperty("unit")]
    public string Unit { get; set; }

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

public class Warning
{
    [JsonProperty("unit")]
    public string Unit { get; set; }

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

public class SharedParam
{
    [JsonProperty("unit")]
    public string Unit { get; set; }

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

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

public class Parameters
{
    [JsonProperty("alarm")]
    public Alarm Alarm { get; set; }

    [JsonProperty("warning")]
    public Warning Warning { get; set; }

    [JsonProperty("sharedParam")]
    public SharedParam SharedParam { get; set; }

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

public class Datum
{
    [JsonProperty("id")]
    public int Id { get; set; }

    [JsonProperty("alertName")]
    public string AlertName { get; set; }

    [JsonProperty("alertMnemonic")]
    public string AlertMnemonic { get; set; }

    [JsonProperty("enabled")]
    public bool Enabled { get; set; }

    [JsonProperty("parameters")]
    public Parameters Parameters { get; set; }
}

public class Example
{
    [JsonProperty("data")]
    public IList<Datum> Data { get; set; }

    [JsonProperty("error")]
    public object Error { get; set; }
}

Теперь для декодирования используйте вспомогательный класс из ссылки на статью выше:
Result = JsonHelper.ToClass<Example>(rawJson);

где rawJson это строковый объект с данными JSON.


JoshWigley

Привет Грэм,

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

Спасибо,
Подшучивать

Рейтинг:
1

Ahmed Raouf

Я написал код javascript с помощью jQuery для обхода любого объекта json с любой структурой и возврата HTML-таблицы для отображения содержимого объекта json. Я надеюсь, что этот код поможет вам:

var outHtml = '';
        var tblHtml = '';
        function parseJsonResult(obj) { 

            outHtml = '';
            tblHtml = '';

            $.each(obj, function (key, value) {

                tblHtml += '<tr><td class="jsonTd1">' + key + '</td>';
                parseJsonRecursive(key, value);
                tblHtml += '</tr>';
            });

            outHtml = '<div><table  class="jsonTbl">' + tblHtml + '</table></div>';

            return outHtml;
        }

        function parseJsonRecursive(key, val) {

            try {

                try {

                    try {
                        $.each(val, function (k, v) {
              
                        });

                        tblHtml += '<td><table>';
                    }
                    catch {
                        
                    }

                    $.each(val, function (k, v) {
                        tblHtml += '<tr><td class="jsonTd1">' + k + '</td>';
                        parseJsonRecursive(k, v);
                        tblHtml += '</tr>';

                    });

                    tblHtml += '</table></td>';
                }
                catch (ee) {

                    var obj = jQuery.parseJSON(val);

                    try {

                            $.each(obj, function (k, v) {

                            });

                            tblHtml += '<td><table>';
                    }
                    catch {

                    }

          

                    $.each(obj, function (k, v) {
                        tblHtml += '<tr><td class="jsonTd1">' + k + '</td>';
                        parseJsonRecursive(k, v);
                        tblHtml += '</tr>';
                    });

                    tblHtml += '</table></td>';
                }

            }
            catch (e) {
                //alert(4);
                //alert(outHtml);
                tblHtml += '<td class="jsonTd2">' + val + '</td>';

                //alert(key + ": " + val);
            }

        }


<style>
        .jsonTbl tr {
            border-style:solid;
            border-color : black;
            border-width: thin;
        }

        .jsonTd1 {
            padding-left: 10px;
            padding-right: 10px;
            border-left-style: solid;
            border-left-color: black;
            border-left-width: thin;
            color: blue;
            font-size: large;
            font-weight: bold;
        }

        .jsonTd2 {
            padding-left: 10px;
            padding-right: 10px;
        }
    </style>

Чтобы вызвать функцию:
var contentHtml = '';
		try {
			contentHtml = parseJsonResult(jsonObjectToParse));
		}
		catch{

		}


Рейтинг:
0

Eric Lynch

Короткий ответ заключается в том, что ваша модель не соответствует вашему документу JSON. Так же как и код (который не использует вашу модель), который вы сейчас пытаетесь использовать. Я проигнорирую последнее, поскольку это, похоже, попытка исправить первое.

Вы JSON документ имеет один JObject на самом внешнем уровне-не массив. Этот единственный объект состоит из двух свойств data и error Одно из таких свойств (data) содержит массив значений.

Итак, начните с этого:

public class MyObject
{
  public List<AlertObject> data { get; set; }
  public string error { get; set; }
}


Далее вам нужно посмотреть на то, что AlertObject фактически содержать. Он, по-видимому, содержит пять свойств (и тип данных действительно имеет значение).

public class AlertObject
{
  public int id { get; set; }
  public string alertName { get; set; }
  public string alertMnemonic { get; set; }
  public bool enabled { get; set; }
  public List<AlertParameter> parameters { get; set; }
}


Я оставлю вас, чтобы правильно вычислить модель для AlertParameter исходя из вышесказанного. Суть в том, что все члены, имена и типы данных должны соответствовать вашему документу JSON. Если вы просто "подойдете ближе", вы получите исключение, говорящее вам об этом. И, в таком случае, просто подбрасывая dynamic ключевое слово там не решит вашу проблему :)