json数据重新组合的问题

ahking 2017-12-21 07:57:14
有个json数据体,内容如下:
[
{id:1,sj:"2017-10-1",v:10},
{id:1,sj:"2017-10-2",v:20},
{id:1,sj:"2017-10-3",v:30},
{id:1,sj:"2017-10-4",v:40},
.....
]
想转换为这种格式:
{
sj:["2017-10-1","2017-10-2","2017-10-3","2017-10-4"......],
v:[10,20,30,40......]
}
怎么实现呢?
...全文
404 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
dynamic 只是一个语法糖,所以它只用来消除繁琐的反射代码,而并不是软件设计。真正的软件设计应该恰好说明具体的数据结构。 你自己应该事先就清楚 var list= JsonConvert.DeserializeObject<dynamic>(.....) 这种语句根本不能得到所需要的真正的数据结构。有这个意识就好办了。
  • 打赏
  • 举报
回复
编程设计要尽可能地具体详细,过分抽象跟没有抽象其实都是同样性质的问题,都无有真正能力解决问题。代码
var str = @"
[
{id:1,sj:""2017 - 10 - 1"",v:10},
{ id: 1,sj: ""2017-10-2"",v: 20},
{ id: 1,sj: ""2017-10-3"",v: 30},
{ id: 1,sj: ""2017-10-4"",v: 40}
]";
var cn = JsonConvert.DeserializeObject<List<ExpandoObject>>(str);
var result = new
{
    sj = (from dynamic x in cn select (string)x.sj).ToList(),
    v = (from dynamic x in cn select (int)x.v).ToList()
};
Debug.Assert(result.sj.Count() == 4);
Debug.Assert(result.v[3] == 40);
var json = JObject.FromObject(result).ToString();
这里必须具体到 List<ExpandoObject> 这类结构化声明,才能知道下一步该干什么。否则如果太空洞了,编译器不知道如何帮你检查bug、如何产生编译代码,你写的代码也是不能明确 list 变量到底能不能指导后边的代码流程。
  • 打赏
  • 举报
回复
引用 8 楼 ahking 的回复:

  var list= JsonConvert.DeserializeObject<dynamic>(sr.ReadToEnd());
var query =list.GroupBy(p => p.id).Select(g => new { sj =  g.Select(t => t.sj).ToArray(), v = g.Select(t => t.v).ToArray() });
错误 CS1977 如果不事先将 lambda 表达式强制转换为委托或表达式树类型,则无法将该表达式用作动态调度的操作的参数。 这块不太清楚,请问是怎么回事?
dynamic 要跟 ExpandoObject 相互适配,才能解决问题。 可以写
            var str = @"
[
{id:1,sj:""2017 - 10 - 1"",v:10},
{ id: 1,sj: ""2017-10-2"",v: 20},
{ id: 1,sj: ""2017-10-3"",v: 30},
{ id: 1,sj: ""2017-10-4"",v: 40}
]";
            var cn = JsonConvert.DeserializeObject<List<ExpandoObject>>(str);
            var result = new
            {
                sj = (from dynamic x in cn select (string)x.sj).ToList(),
                v = (from dynamic x in cn select (int)x.v).ToList()
            };
            Debug.Assert(result.sj.Count() == 4);
            Debug.Assert(result.v[3] == 40);
            var json = JObject.FromObject(result).ToString();
结果就是
{
  "sj": [
    "2017 - 10 - 1",
    "2017-10-2",
    "2017-10-3",
    "2017-10-4"
  ],
  "v": [
    10,
    20,
    30,
    40
  ]
}
its_good 2017-12-22
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
json反序列化后linq通过group,再select 大致代码
var query = list.GroupBy(p=>p.id).Select(g=>new { sj = string.Join(",",g.Select(t=>t.sj)),v= string.Join(",", g.Select(t => t.v)) })
最后将结果再序列化成json
请问下: 按照id分组的目的是什么? 没有分组也一样可以达到效果的吧,难道还有什么坑?

string strJsonValue = "[{\"id\":1,\"sj\":\"2017-10-1\",\"v\":10},{\"id\":1,\"sj\":\"2017-10-2\",\"v\":20},{\"id\":1,\"sj\":\"2017-10-3\",\"v\":30}]";
//反序列化
JArray arrayJsonData = JArray.Parse(strJsonValue);
//处理数据
var newObject = new { sj = arrayJsonData.Select(d => d["sj"]), v = arrayJsonData.Select(d => d["v"]) };
//序列化
string strNewData = JsonConvert.SerializeObject(newObject); //结果:{"sj":["2017-10-1","2017-10-2","2017-10-3"],"v":[10,20,30]}
ahking 2017-12-22
  • 打赏
  • 举报
回复

  var list= JsonConvert.DeserializeObject<dynamic>(sr.ReadToEnd());
var query =list.GroupBy(p => p.id).Select(g => new { sj =  g.Select(t => t.sj).ToArray(), v = g.Select(t => t.v).ToArray() });
错误 CS1977 如果不事先将 lambda 表达式强制转换为委托或表达式树类型,则无法将该表达式用作动态调度的操作的参数。 这块不太清楚,请问是怎么回事?
全栈极简 2017-12-21
  • 打赏
  • 举报
回复
就是json的序列化与反序列化。 1)先将json字符串,反序列化为对象 2)将对象序列化为对应的json字符串
正怒月神 版主 2017-12-21
  • 打赏
  • 举报
回复
3楼正解, 代码没看,思路就是这样的。 先反序列化成泛型集合,然后通过集合的聚合操作得到新的实体模型。 最后序列化json
  • 打赏
  • 举报
回复
你后面是数组,那就不是string.join,而是ToArray
  • 打赏
  • 举报
回复
json反序列化后linq通过group,再select 大致代码
var query = list.GroupBy(p=>p.id).Select(g=>new { sj = string.Join(",",g.Select(t=>t.sj)),v= string.Join(",", g.Select(t => t.v)) })
最后将结果再序列化成json
大鱼> 2017-12-21
  • 打赏
  • 举报
回复
后面那个是不是json呢?我还真不知道哦
weixin_41417941 2017-12-21
  • 打赏
  • 举报
回复
我是小白,,这个是不是可以读取到后台,然后通过spilt函数,加上for循环解决。
misswangjinfeng 2017-12-21
  • 打赏
  • 举报
回复
先把json格式转为对象 然后把对象重新转json字符串 jsonHelper.DeserializeJsonToObject<实体类名称>(json字符串);

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧