【问题标题】:How to convert JSON property value to array of keys and values如何将 JSON 属性值转换为键和值数组
【发布时间】: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);'

标签: c# json regex


【解决方案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 并将值存储在临时字典中,然后将其附加到列表中
    猜你喜欢
    • 2022-11-01
    • 2013-01-14
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2012-09-26
    • 2019-04-21
    • 2013-05-03
    • 1970-01-01
    相关资源
    最近更新 更多