как извлечь массив строковых значений из десериализованного ответа JSON - PullRequest
1 голос
/ 23 мая 2019

Я довольно новичок в кодировании, и вот мое требование:

  • Я получаю ответ JSON , имеющий массив значений (см. Чтение, обновление, удаление в приведенном ниже ответе JSON )
  • Число значений является динамическим и имеет тенденцию меняться каждый раз.
  • Я хочу знать, как получить их, поместить в строковый массив и вернуть значения

Например: конечный результат должен быть как

string[] deleteValues = {"MCS:Menu:Admin","MCS:test"}

Если на этот вопрос уже есть ответ, пожалуйста, укажите мне правильное направление.

Заранее спасибо

==========================================

Я могу получить значения таким образом ...

string value1 = new JavaScriptSerializer().Deserialize<JSON_Deconstructor>(resp).Permitted[0].Delete[0].ToString();

string value2 = new JavaScriptSerializer().Deserialize<JSON_Deconstructor>(resp).Permitted[0].Delete[1].ToString();

но так как количество значений в удалении является динамическим, мне нужно, как их вытащить.

====================

фрагмент кода:

string resp = new StreamReader(request1.GetResponse().GetResponseStream()).ReadToEnd(); // resp is a JSON response from a server
JSON_Deconstructor dc = new JSON_Deconstructor { };
dc.Permitted = new Permitted[1];

string value1 = new JavaScriptSerializer().Deserialize<JSON_Deconstructor>(resp).Permitted[0].Delete[0].ToString();

string value2 = new JavaScriptSerializer().Deserialize<JSON_Deconstructor>(resp).Permitted[0].Delete[1].ToString();

==================

Содержимое класса JSON_Deconstructor:

public class JSON_Deconstructor
{
    public Permitted[] Permitted { get; set; }
    public Denied[] Denied { get; set; }
}

==================

Разрешенное содержание класса:

public class Permitted
{
    public string[] Read { get; set; }
    public string[] Update { get; set; }
    public string[] Delete { get; set; }
}

=================

JSON-ответ:

{
"Permitted": [
    {
        "read": [
            "MCS:Menu:Admin"
        ],
        "update": [
            "MCS:test"
        ],
        "delete": [
            "MCS:Menu:Admin",
            "MCS:test"
        ]
    }
]
}

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Сначала добавьте jsonProperty в ваш класс, чтобы иметь возможность сериализации.

public class Permitted
{
    [JsonProperty("read")]
    public string[] Read { get; set; }
    [JsonProperty("update")]
    public string[] Update { get; set; }
    [JsonProperty("delete")]
    public string[] Delete { get; set; }
}

//Response contains a list of permitted objects in Permitted property
public class PermittedResponse
{
    public List<Permitted> Permitted { get; set; }
}

, затем в вашем методе де-сериализуйте ваш ответ и выполните циклический просмотр результатов для построения ваших массивов.

List<string> deletedValues = new List<string>();
List<string> readValues = new List<string>();
List<string> updateValues = new List<string>();

PermittedResponse response = JsonConvert.DeserializeObject<PermittedResponse>(serializedJson);

response.Permitted.ForEach(e =>
   {
        deletedValues = deletedValues.Concat(e.Delete).ToList();
        readValues = readValues.Concat(e.Read).ToList();
        updateValues = updateValues.Concat(e.Update ).ToList();
   });
0 голосов
/ 23 мая 2019

Используйте Newtonsoft.Json.Вы можете получить это от NuGet.Это очень простая и мощная библиотека для Json.

Теперь вы должны создать класс, например:

public class Item
{
    public List<string> MCS { get; set; } = new List<string>();
} 

public class PermitedItem
{
    public Item read {get; set;}
    public Item update {get; set;}
    public Item delete {get; set;}
}
public class MyResponse
{
    public List<PermittedItem> Permitted = new List<PermittedItems>();
}

И затем использовать его так:

MyResponse result = JsonConvert.DeserializeObject<MyResponse>(jsonAsString);

Это должно работать.

...