从 json 数组字符串中获取数据到字符串变量

Posted

技术标签:

【中文标题】从 json 数组字符串中获取数据到字符串变量【英文标题】:get data from json array string to an string variable 【发布时间】:2020-11-06 09:01:12 【问题描述】:

我从另一个应用程序收到一个带有 JSON 有效负载的 HTTP 请求,如下所示:


    "reportName": "myfile",
    "type_1": "pdf",
    "paramm": [
         "REF": "value1",
         "whatevervalue2": "whatevervalue2" 
    ]

我收到数据并尝试处理它。我创建了一个类来从 JSON 中获取数据:

public class ReportId

    public string reportName  get; set; 
    public string type_1  get; set; 
    public object[] paramm  get; set; 

这是我在 API 控制器上处理所有数据的方法:

[HttpPost]
public IActionResult generate([FromBody] ReportId jsonResult)

    try
    
        var reportName = jsonResult.reportName;
        var type = jsonResult.type_1;
        var recParam = jsonResult.paramm;
//....

        List<ReportParameter> parameters = new List<ReportParameter>();
        foreach (var t in recParam)
        
            string[] paramName;
            paramName = t.ToString().Split(":");
            parameters.Add(new ReportParameter() 
             
                Name = paramName[0], 
                Labels = new List<string>()  paramName[1] , 
                Values = new List<string>()  paramName[1]  
            );
        
        reportWriter.SetParameters(parameters);
//....
    
    catch
    
        return null;
    

我对@9​​87654324@ 和type_1 没有任何问题,但在paramm 上它有点不稳定。我需要从 JSON 中获取该数组的值。我确实设法得到它们,但使用“所有格式”。例如,在第一个拆分后,我会得到:

"\r\n  \"REF\""
" \"value1\"\r\n"

有没有更优雅的方法可以从 paramm 数组中获取值,而不必替换不属于“真实”字符串的字符?

提前致谢。

[编辑澄清] 在 JSON 上,我将获得多个参数:

    "paramm": [
         "parameter1": "value1" ,
         "parameter2": "value2" ,
         "parameter3": "value3" 
    ]

参数名称可以是任何单词,值也可以是任何单词。这些参数被发送到 RDL 以过滤一些查询,因此我需要获取名称(参数 1、2、3...)及其值并将其作为参数添加到每个参数的迭代中。

【问题讨论】:

@itsme86 他们是......模型绑定确实使用 Json.Net 或 .Net 自己的 JSON 解析器......由于某些原因,他们不想将看起来像字典的东西声明为字典。 .. vvic - 请澄清您期望从该 JSON 中实现什么。对于外部观察者来说,它看起来就像普通字典......问题是你有重复的键(即使已经有很多问题)? 为澄清而编辑。谢谢 【参考方案1】:

是的,有一个更简单的方法。

在您的ReportId 类中,将paramm 成员更改为List&lt;Dictionary&lt;string, string&gt;&gt; 而不是object[]

public class ReportId

    ...
    public List<Dictionary<string, string>> paramm  get; set; 

然后,在您的 generate 方法中,您可以从每个字典中获取键和值,而无需进行字符串操作:

List<ReportParameter> parameters = new List<ReportParameter>();
foreach (var dict in recParam)

    var kvp = dict.First();
    parameters.Add(new ReportParameter() 
     
        Name = kvp.Key, 
        Labels = new List<string>()  kvp.Value , 
        Values = new List<string>()  kvp.Value  
    );

【讨论】:

实际上就像一个魅力。非常感谢。 没问题;很高兴我能帮上忙。【参考方案2】:

我猜,你的 ReportId 类应该是这样的。我希望这会奏效。

public partial class ReportId

    [JsonProperty("reportName")]
    public string ReportName  get; set; 

    [JsonProperty("type_1")]
    public string Type1  get; set; 

    [JsonProperty("paramm")]
    public Paramm[] Paramm  get; set; 


public partial class Paramm

    [JsonProperty("REF", NullValueHandling = NullValueHandling.Ignore)]
    public string Ref  get; set; 

    [JsonProperty("whatevervalue2", NullValueHandling = NullValueHandling.Ignore)]
    public string Whatevervalue2  get; set; 

【讨论】:

接近我所需要的。 Paramm 只是我需要接收的可变数量的参数(可以是 2、3 甚至没有)。它们将包含一个名称(示例中为“REF”,但可以是任何名称)和一个值。然后我需要迭代这些参数并将它们分配给parameters.Add var ri = new ReportId(); ri.Paramms = new Paramm[10]; ri.Paramms[0]= new Paramm()Ref="asd",Whatevervalue2 = "asd";your answer 也可以,但是您需要定义数组的大小,因此 List 在使用时会更好和方便

以上是关于从 json 数组字符串中获取数据到字符串变量的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:从包含json字符串的nvarchar(max)变量中获取所有字符串出现(标记)

使用 json_decode 从 json 获取字符串数组

基于AJAX获取数据/JSON字符串转换为对象

如何创建一个 Flutter Futurebuilder 函数来显示从 JSON 中获取的字符串数组?

如何使用 SwiftyJSON 获取字符串元素数组?

swiftyjson 从 json 数组中获取字符串