如何将 JSON 属性值转换为键和值数组

Posted

技术标签:

【中文标题】如何将 JSON 属性值转换为键和值数组【英文标题】:How to convert JSON property value to array of keys and values 【发布时间】:2020-01-06 18:12:35 【问题描述】:

我正在使用 Newtonsoft.JSON 将 DataTable 序列化为单个 JSON 有效负载。

生成的有效载荷如下所示:

[
    
        "Name" : "Example_Name_1",
        "Value": "Example Value 1"
    ,
    
        "Name" : "Example_Name_2",
        "Value": "Example Value 2"
    ,...
]

为了与外部库一起使用,我需要它喜欢:

[
    
        "Name" : "Example_Name_1",
        "Value": 
            "Value": "Example Value 1"
        
    ,
    
        "Name" : "Example_Name_2",
        "Value": 
            "Value": "Example Value 2"
        
    ,...
]

有什么方法可以进行这种转换吗? 我一直在研究正则表达式,但没有任何运气。

我一直在使用不同的正则表达式模式,我看到了另一个类似的 SO 解决方案,但使用了 javascript 映射?

var strJson = "[\"Name\": \"Example_Name_1\",\"Value\": \"Example Value 1\"]";

var pattern = "\"Name\": \"*\",\"Value\": \"*\"";
var replacement = "\"Name\": \"*\",\"Value\": \"Value\": \"*\"";
var input = strJSON;
var result = Regex.Replace(input, pattern, replacement);

return result;

[编辑] 数据表只有 2 列:Property_Name 和 Property_Value 我正在序列化它

    JsonConvert.SerializeObject(myDataTable);

【问题讨论】:

请也提供序列化码 @ingvar 'JsonConvert.SerializeObject(myDataTable);' 【参考方案1】:

我可能会使用 LINQ 将数据表转换为您喜欢的格式。您没有提供实际的数据表,但转换将是这样的:

IEnumerable<Data> yourData = GetData();

var transformedData = yourData.Select(d => new 
    Name = d.Name,
    Value = new 
        Value = d.Value
    
);

string json = JsonConvert.SerializeObject(transformedData);

json 变量现在应该(希望)采用您想要的格式,而无需使用正则表达式。

【讨论】:

【参考方案2】:

看看 Newtonsoft.Json.Linq 命名空间。它包含 JObject、JArray 和 JToken 等类来实现您想要做的事情。

这里有一个简短的 sn-p 开始:

var strJson = "[\"Name\": \"Example_Name_1\",\"Value\": \"Example Value 1\"]";
var newObject = JArray.Parse(strJson);
for(int i = 0; i < newObject.Count; i++)

    newObject[i]["Value"] = new JObject()
    
         "Value", newObject[i]["Value"] 
    ;

您可以遍历原始 JObject 的后代,查找键“Value”或其他内容,以将其从字符串转换为 JObject,就像我的代码示例一样。

【讨论】:

System.ArgumentException: '无法将 Newtonsoft.Json.Linq.JValue 添加到 Newtonsoft.Json.Linq.JObject。' @Rhystic,我更新了答案,使其正常工作。这次我测试了代码:) 为了得到一个缩小的Json字符串,我添加了:return newObject.ToString(Formatting.None);【参考方案3】:

您可以将响应解析为 json 并循环访问数据以创建新对象。 请查看我使用您的示例数据创建的代码。

var runCode = function()
  var strJson = "[\"Name\": \"Example_Name_1\",\"Value\": \"Example Value 1\",\"Name\": \"Example_Name_2\",\"Value\": \"Example Value 2\"]";
  parsedJson = JSON.parse(strJson)
  new_json = []
  for (var i = 0; i < parsedJson.length; i++) 
    temp_json = 
    temp_json['Name'] = parsedJson[i]['Name']
    temp_json['Value'] = 
      'Value': parsedJson[i]['Value']
    
    new_json.push(temp_json)
  
  console.log(new_json)


runCode()

【讨论】:

截图看起来效果很好。您介意将其转换为 C# 函数吗? @Rhystic 对此感到抱歉,但我对 c# 不太了解。但是您可以使用此逻辑循环遍历 json。您需要做的就是遍历 json 并将值存储在临时字典中,然后将其附加到列表中

以上是关于如何将 JSON 属性值转换为键和值数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用 Scala-Play Json 框架解析 Json 时获取键和值?

如何从嵌套 Json 数组角度 2 打印和分离键和值并将其添加到选择框中

高效地将 JavaScript 键和值数组转换为对象

如何使用键和值创建json对象,其中value是数组

以键和值数组的形式快速从 JSON 中检索特定数组?

使用 boost 属性树遍历 json 属性键和值