把以下json对象
{"msg_flowid":"22","msg_opt_nu":"22","msg_chk_in":"22","msg_chk_acc":"22","msg_chk_out":"22"}
按照下划线分割,变成以下具有层级关系的json对象
{"msg":{"flowid":"22","opt":{"nu":"22"},"chk":{"in":"22","acc":"22","out":"22"}}}
其中的字段都是动态变化的,并不是死的,层级也是变化的,所以不能使用硬编码的方式。本文中的仅仅是举例子。抱歉,刚才我的提问没有表达清楚。感谢各位回答问题的大佬。
你这个问题关键点是把{"msg_flowid":"22","msg_opt_nu":"22","msg_chk_in":"22","msg_chk_acc":"22","msg_chk_out":"22"}重新格式化,可以考虑一下用字符串的分割、拼接来获得下面的json字符串
直接上代码么
class Program
{
static void Main(string[] args)
{
string jsonStr = File.ReadAllText("test.json");
Console.WriteLine(jsonStr);
JObject jObject= jsonStr.JsonFromString<JObject>();
JObject target = new JObject();
jObject.Properties().ToList().ForEach(jp=> {
Console.WriteLine($"{jp.Name}==={jp.Value}");
string[] names= jp.Name.Split('_');
//创建对象
JObject node = new JObject();
node[names[names.Count() -1]] = jp.Value;
for (int i = names.Count()-2; i >=0; --i)
{
JObject tempObj = new JObject();
tempObj[names[i]] = node;
node = tempObj;
}
//合入目标对象中
DataMerge(node,target);
});
Console.WriteLine("=========================");
string targetStr= target.JsonToString();
Console.WriteLine(targetStr);
File.WriteAllText("test1.json",targetStr);
Console.ReadKey();
}
private static void DataMerge(JObject src,JObject dst)
{
var node_jp = src.Properties().First();
var temp = dst.Properties().ToList().Find(it => it.Name == node_jp.Name);
if(temp == null)
{
dst[node_jp.Name] = node_jp.Value;
}
else
{
DataMerge(node_jp.Value as JObject,temp.Value as JObject);
}
}
}
使用了Newtonsoft.Json.使用的扩展方法参见https://blog.csdn.net/SANYUNI/article/details/109135752