反序列化json字符串为对象,怎么忽略根节点?

newlju 2016-05-26 12:16:44
json字符串:

{"root":[
{"name":"名字1","id":1},
{"name":"名字2","id":2}
]}


类:
public class CModel
{
public string name { get; set; }
public int id { get; set; }

}

用DataContractJsonSerializer或Newtonsoft.Json反序列化,忽略根节点root反序列化为 CModel[] 数组,要怎么做?
...全文
459 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
我叫小菜菜 2016-10-25
  • 打赏
  • 举报
回复
引用 12 楼 flyhorse1010 的回复:
Newtonsoft.Json.JsonConvert里的.
        public static string SerializeXmlNode(XmlNode node);
        public static string SerializeXmlNode(XmlNode node, Formatting formatting);
        public static string SerializeXmlNode(XmlNode node, Formatting formatting, bool omitRootObject);
楼主试试第3个方法看看,omitRootObject是省略根节点对象的意思
试试这个呗。 该做的还是的做,不能省,比如前戏。
flyhorse1010 2016-10-25
  • 打赏
  • 举报
回复
Newtonsoft.Json.JsonConvert里的.
        public static string SerializeXmlNode(XmlNode node);
        public static string SerializeXmlNode(XmlNode node, Formatting formatting);
        public static string SerializeXmlNode(XmlNode node, Formatting formatting, bool omitRootObject);
楼主试试第3个方法看看,omitRootObject是省略根节点对象的意思
software_artisan 2016-05-30
  • 打赏
  • 举报
回复
引用 3 楼 newlju 的回复:
[quote=引用 2 楼 xuanbg 的回复:] 哪里有什么根节点?分明就是一个名字叫root的集合


public class ObjList
{
    public List<CModel> root { get; set; }
}

public class CModel
{
    public string name { get; set; }
    public int id { get; set; }
}
就是不想定义二个类,而且root的不固定.可能是root1也可能是base等等,我需要直接从序列化出根层后的内容[/quote] 那你不如直接序列化成一个CModel集合好了,干嘛还要外面封个root呢?json又没有规定必须有根节点
xuzuning 2016-05-26
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Text.RegularExpressions;

namespace jsonTest
{
class Program
{
static void Main(string[] args)
{
//定义一个JSON字符串
string jsonText = "{\"root\":[{\"name\":\"名字1\",\"id\":1},{\"name\":\"名字2\",\"id\":2}]}";
//jsonText = "[{'name':'名字1','id':1},{'name':'名字2','id':2}]"; //这样的 json 也可以接受
jsonText = Regex.Replace(jsonText, @".*(\[.+\]).*", x => x.Groups[1].Value); //用正则去掉数组外的内容
//反序列化JSON字符串
JArray ja = (JArray)JsonConvert.DeserializeObject(jsonText);

foreach (var o in ja) //o 是 JObject 类型
{
Console.WriteLine("id:{0} name:{1}", o["id"], o["name"]);
}
Console.ReadKey();
}
}
}
Poopaye 2016-05-26
  • 打赏
  • 举报
回复
头尾去掉不就行了
int start = json.IndexOf('[');
int end = json.LastIndexOf(']');
json = json.SubString(start, end - start + 1);
newlju 2016-05-26
  • 打赏
  • 举报
回复
引用 2 楼 xuanbg 的回复:
哪里有什么根节点?分明就是一个名字叫root的集合


public class ObjList
{
    public List<CModel> root { get; set; }
}

public class CModel
{
    public string name { get; set; }
    public int id { get; set; }
}
就是不想定义二个类,而且root的不固定.可能是root1也可能是base等等,我需要直接从序列化出根层后的内容
software_artisan 2016-05-26
  • 打赏
  • 举报
回复
哪里有什么根节点?分明就是一个名字叫root的集合


public class ObjList
{
    public List<CModel> root { get; set; }
}

public class CModel
{
    public string name { get; set; }
    public int id { get; set; }
}
Justin-Liu 2016-05-26
  • 打赏
  • 举报
回复
遍历生成数组
Poopaye 2016-05-26
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
[quote=引用 4 楼 shingoscar 的回复:] 头尾去掉不就行了
int start = json.IndexOf('[');
int end = json.LastIndexOf(']');
json = json.SubString(start, end - start + 1);
别瞎整啊。万一人家 root 里边也有数组,或者人家那么里边也有 ] 符号怎么办呢?不能抠字眼儿的时候,千万不要用这种简单匹配字眼儿的做法。[/quote] 如果是root外面有数组你这样还好说,里面有又不影响 end赋值用的是LastIndexOf,不是IndexOf
  • 打赏
  • 举报
回复
不想额外定义一个封装类的话,就你的例子那你可以简单的用Dictionary<string,List<CModel>>来反序列化
  • 打赏
  • 举报
回复
或者人家那么里边也有 ] 符号怎么办呢 --> 或者人家 name 字段里边也有 ] 符号怎么办呢 如果你需要自己进一步写解析程序,那么就是用灵活的 json 对象类型模式。如果你需要直接进行业务逻辑处理,那么就倾向于强类型地编程。 一般来说,跟一个靠谱的软件公司合作搞开发,这个“根节点”的名字是不会随便改变其含义的,是会特意写文档、最先定义好的。
  • 打赏
  • 举报
回复
里边 --> 前边
引用 3 楼 newlju 的回复:
就是不想定义二个类,而且root的不固定.可能是root1也可能是base等等,我需要直接从序列化出根层后的内容
如果你收到的数据根本没有模式,你怎么知道你的数组是在 root 还是root1 里边呢? Newtonsoft 可以反序列化为 JObject、JArray 等等 token,具有一套 .net json 模型类型。不过所谓灵活的 json 对象模式,应该只是用来处理它最合适做的事情。你不应该在你原本应该事先知道 root 还是 root1 的时候还假装不知道啊。
  • 打赏
  • 举报
回复
引用 4 楼 shingoscar 的回复:
头尾去掉不就行了
int start = json.IndexOf('[');
int end = json.LastIndexOf(']');
json = json.SubString(start, end - start + 1);
别瞎整啊。万一人家 root 里边也有数组,或者人家那么里边也有 ] 符号怎么办呢?不能抠字眼儿的时候,千万不要用这种简单匹配字眼儿的做法。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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