【问题标题】:how to pull out array of string values from a deserialized JSON response如何从反序列化的 JSON 响应中提取字符串值数组
【发布时间】:2019-05-23 10:44:06
【问题描述】:

我对编码很陌生,这是我的要求:

  • 我收到一个 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();

但由于 delete 中的值的数量是动态的,我需要知道如何提取它们。

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

代码sn-p:

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"
        ]
    }
]
}

【问题讨论】:

  • 请添加一个你想做什么的例子。
  • 使用forach()?你想用这些值做什么?
  • @itdoesntwork 我已经编辑了一个我想要最终结果的示例
  • 会将 JSON 解析为 .NET 对象,对其进行修改(您可以在代码中对此类对象执行任何操作,删除您想要的任何内容等),然后将其序列化回 JSON 为您工作?通常,您有一个输入和一个输出模型(.NET 对象)。您将 JSON 解析为输入模型,将其转换为输出模型,然后将其序列化回 JSON。输入和输出模型应对应于输入/输出 JSON。
  • @Aditia,你能否解释一下no. 是什么?

标签: c# .net json json.net deserialization


【解决方案1】:

首先将 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();
   });

【讨论】:

  • 我需要添加什么参考才能使用 JsonProperty 和 JsonConvert ?
  • google 是你的朋友。在本例中使用这些“使用 System.Collections.Generic;使用 System.Linq;使用 Newtonsoft.Json;”
  • 我尝试过,但我收到错误消息“无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[Testing_MDP.允许]',因为该类型需要 JSON 数组(例如 [1,2,3])才能正确反序列化。”
  • 更新的答案..您的响应对象与我提供的映射不同。请再试一次
  • 谢谢先生!!!它工作顺利......但是我不得不在其他两个地方更改 e.Delete 以捕获其他值。大声笑 :) 但代码是正确的目标。
【解决方案2】:

使用 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);

这应该可行。

【讨论】:

  • 当然,JSON.NET 是比 JavaScriptSerializer 更方便的 API,但这与如何读取嵌套数组的问题无关。
  • 您不必对 JSON.NET 做任何特别的事情,因为它自己做所有事情。您必须创建正确的类。就是这样。
猜你喜欢
  • 2022-09-23
  • 2022-01-21
  • 2016-12-22
  • 2013-07-16
  • 1970-01-01
  • 2015-11-26
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多