公司使用了一种伪Json, 当value为字符串并且以"@"开头时, 要替换成真实的值, 比如{"name":"@countryName"}, 那么就要把@countryName替换掉, 这就涉及到使用Json.net进行遍历
以前都是直接写相应的class然后直接Newtonsoft.Json.JsonConvert.DeserializeObject<T>()就可以了, 遍历的方法还是很不好找, 所以给共享出来

private static void RecursivelyReplaceVariable(JToken jToken, Dictionary<string, string> variables)
{
if (jToken is JValue)
{
return;
}
var childToken = jToken.First;
while (childToken != null)
{
if (childToken.Type == JTokenType.Property)
{
var p = (JProperty)childToken;
var valueType = p.Value.Type; if (valueType == JTokenType.String)
{ var value = p.Value.ToString();
if (value.StartsWith("@"))
{
if (!variables.TryGetValue(value, out value))
{
throw new Exception($"Variable {value} not defined");
}
p.Value = value;
}
}
else if (valueType == JTokenType.Object)
{
RecursivelyReplaceVariable(p.Value, variables);
}
else if (valueType == JTokenType.Array)
{
foreach (var item in (JArray)p.Value)
{
RecursivelyReplaceVariable(item, variables);
}
}
}
childToken = childToken.Next;
}
}

另外一种方法

var properties = jObject.Properties();
foreach (var property in properties)
{
var valueType = property.Value.Type;
if (valueType== JTokenType.Object)
{
ReplaceValue((JObject)property.Value );
}
else if (valueType== JTokenType.String)
{
property.Value = "...";
}
else if (valueType== JTokenType.Array)
{
var k=property.Value.First();
foreach (var item in (JArray)property.Value)
{
ReplaceValue((JObject)item);
}
}
}

Json.net中一些基础类的继承关系

JObject、JProperty、JArray、JConstructor继承自JContainer(abstract)
JValue、JContainer继承自JToken(abstract)

使用Json.net对Json进行遍历的更多相关文章

  1. Javascript中JSON对象的操作以及遍历key/value

    //遍历获取值: function text(){ var json = {"options":"[{/"text/":/"王家湾/&quo ...

  2. 对于json对像,怎么遍历json对象的所有key,在使用json对象时,如果无法知道key,怎么通过key变量来获取值

    对于json对像,怎么遍历json对象的所有key,在使用json对象时,如果无法知道key,怎么通过key变量来获取值?请参阅下面的关键代码: <html> <head> & ...

  3. JSON对象与JSON数组的长度和遍历方法

    JSON对象与JSON数组的长度和遍历方法         1.json对象的长度与遍历                 结构:var json={“name”:”sm”,”sex”:”woman”} ...

  4. json格式的数据及遍历:

    代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  5. JSON语法、对象、遍历数组的区别和基本操作

    JSON 语法规则 JSON 语法是 javascript 对象表示语法的子集. 数据在名称/值对中 数据由逗号分隔 花括号保存对象 方括号保存数组 JSON 名称/值对 JSON 数据的书写格式是: ...

  6. 3.MUI端APP获取Json数据,并且实现遍历

    在MUI中,对JSON的操作还是非常方便的. <script type="text/javascript"> var responseEl = document.get ...

  7. 做筛选遍历时遇到的json字符串、json对象、json数组 三者之间的转换问题

    这个是后台对登录用户以及筛选条件的操作 @Override public List<SdSdPer> listResults(String sidx, String sord) { try ...

  8. JS/Jquery遍历JSON对象、JSON数组、JSON数组字符串、JSON对象字符串

    JS遍历JSON对象 JS遍历JSON对象 <script> var obj = { "goodsid": "01001", "goods ...

  9. 【荐】使用eval()、new Function()将JSON字符串转换为JSON对象

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 第一种解析方式:使用eval函数来解析,并且使用j ...

  10. JSON.parse和JSON.stringify 参数详解

    JSON.parse和JSON.stringify这两个浏览器自带(IE6/7除外)的方法平常我们经常用到,但是一般都只是用到了他们的第一个参数,比如字符串转对象:JSON.parse('{}')   ...

随机推荐

  1. Revit 命令添加下拉框

    在学习revit制作下拉框时,需要分为三个步骤: 1.创建一个面板(panel). RibbonPanel panel10 = application.CreateRibbonPanel(Global ...

  2. IntelliJ IDEA 关闭多余项目

    在开发中 一个项目中可能会有多个子项目,切换起来比较麻烦,需要将用不到的项目关掉 1.就是关闭一个Project中多个module的一个 2.右击要关闭项目,选中弹出窗口中的 Load/Unload ...

  3. maven 版本发布添加上时间戳

    使用插件添加时间戳 我使用的是spring boot - 2.0.3.RELEASE版本 pom中加入 <!-- 加入这个 就可以直接在配置文件中取到时间戳了,注意: 由于${}方式会被mave ...

  4. go 0000

    1,函数不能比较 函数默认都是值传递,  除了  map   值, slice (切片)  channel  (管道)   interface 默认以这4个默认 引用传递 两个 defer      ...

  5. for循环,数字类型,字符串类型

    for 循环: l=['a','b','c'] for i in l : print(i) while循环和for循环 while循环:条件循环,循环的次数取决于条件何时为False for循环:循环 ...

  6. 开源微信管家平台——JeeWx 捷微4.0 微服务版本发布,全新架构,全新UI,提供强大的图文编辑器

    JeeWx捷微4.0   微服务版本发布^_^ 换代产品(全新架构,全新UI,提供强大的图文编辑器) JEEWX 从4.0版本开始,技术架构全新换代,采用微服务架构,插件式开发,每个业务模块都是独立的 ...

  7. .net core 2.2 修改IdentityUser主键标识类型

    .net core2.2,生成WebApi或者MVC项目后,Identity 1.增加ApplicationUser.cs文件,内容如下 public class ApplicationUser : ...

  8. ubuntu中文乱码解决

    首先,安装中文支持包language-pack-zh-hans: $ sudo apt-get install language-pack-zh-hans 然后,修改/etc/environment( ...

  9. Filter过滤器 不登陆无法访问其他页面

    package com.cscy.Filter; import java.io.IOException; import javax.servlet.Filter; import javax.servl ...

  10. 基于WebGL架构的3D可视化平台—新风系统演示

    新风系统是根据在密闭的室内一侧用专用设备向室内送新风,再从另一侧由专用设备向室外排出,在室内会形成“新风流动场”,从而满足室内新风换气的需要.实施方案是:采用高风压.大流量风机.依靠机械强力由一侧向室 ...