c# - 状态为 ObjectStart 的令牌 StartObject 将导致无效的 JSON 对象。小路 ''。”
问题描述
我有这个 JSON
{
name: 'Dashboard',
url: '/Home',
icon: 'icon-speedometer',
},
{
name: 'Reports',
url: '/Reports/GenerateReport',
icon: 'icon-calculator'
},
{
name: 'Administration',
url: '/adminstration',
icon: 'icon-shield',
children: [
{
name: 'Templates',
url: '/Templates/TemplatesList',
// icon: 'icon-settings'
},
{
name: 'Rules',
url: '/Rules/RulesList',
// icon: 'icon-equalizer'
},
{
name: 'Products',
url: '/Products/ProductsList',
// icon: 'icon-grid'
},
{
name: 'Users',
url: '/Users/UsersList'
},
{
name: 'Clients',
url: '/Clients/ClientsList'
}
在 C# 中,这是映射它的模型
public class ParsedAccessPage
{
public int Id { get; set; }
public string name { get; set; }
public string url { get; set; }
public string icon { get; set; }
public List<ParsedAccessPageChild> children { get; set; }
}
public class ParsedAccessPageChild
{
public int Id { get; set; }
public string name { get; set; }
public string url { get; set; }
public int ParentId { get; set; }
}
这个函数将模型解析为 JSON
StringBuilder sb = new StringBuilder();
JsonWriter jw = new JsonTextWriter(new StringWriter(sb));
jw.Formatting = Formatting.Indented;
jw.WriteStartObject();
foreach (var page in parsedAccessPage)
{
jw.WriteStartObject();
jw.WritePropertyName("name");
jw.WriteValue(page.name);
jw.WritePropertyName("url");
jw.WriteValue(page.url);
jw.WritePropertyName("icon");
jw.WriteValue(page.icon);
if (page.children.Count > 0)
{
jw.WritePropertyName("children");
jw.WriteStartObject();
foreach (var child in page.children)
{
jw.WritePropertyName("name");
jw.WriteValue(child.name);
jw.WritePropertyName("url");
jw.WriteValue(child.url);
//jw.WriteEndArray();
}
jw.WriteEndObject();
}
jw.WriteEndObject();
//jw.WriteEndArray();
}
jw.WriteEndObject();
return sb.ToString();
我不断收到此错误:
“处于 ObjectStart 状态的令牌 StartObject 将导致无效的 JSON 对象。路径 ''。”
我不确定为什么第一个 foreach 中的第一行一直在抛出它......我试图让 json 显示为模型。
解决方案
不是children
对象数组类型的属性吗?然后它应该看起来像这样(没有尝试过,只是遵循逻辑):
if (page.children.Count > 0)
{
jw.WritePropertyName("children");
jw.WriteStartArray();
foreach (var child in page.children)
{
jw.WriteStartObject();
jw.WritePropertyName("name");
jw.WriteValue(child.name);
jw.WritePropertyName("url");
jw.WriteValue(child.url);
jw.WriteEndObject();
}
jw.WriteEndArray();
}
更新:
由于整个事物是一个数组,而不是一个对象(您的示例 json 与您发布的方式无效,因为它根本没有封闭标记),它应该如下所示:
StringBuilder sb = new StringBuilder();
JsonWriter jw = new JsonTextWriter(new StringWriter(sb));
jw.Formatting = Newtonsoft.Json.Formatting.Indented;
jw.WriteStartArray();
foreach (var page in parsedAccessPage)
{
jw.WriteStartObject();
jw.WritePropertyName("name");
jw.WriteValue(page.name);
jw.WritePropertyName("url");
jw.WriteValue(page.url);
jw.WritePropertyName("icon");
jw.WriteValue(page.icon);
if (page.children?.Count > 0)
{
jw.WritePropertyName("children");
jw.WriteStartArray();
foreach (var child in page.children)
{
jw.WriteStartObject();
jw.WritePropertyName("name");
jw.WriteValue(child.name);
jw.WritePropertyName("url");
jw.WriteValue(child.url);
jw.WriteEndObject();
}
jw.WriteEndArray();
}
jw.WriteEndObject();
}
jw.WriteEndArray();
而这一次我已经尝试过了……
推荐阅读
- ios - TvOS - UIRequiredDeviceCapabilities 问题
- api - Rest API 资源:为 post 组合但单独获取可以吗?
- object - 如何在 uwp 应用程序中将列表视图项用作按钮?或者如何通过单击 uwp 中的列表视图项来更改文本框的文本?
- algorithm - 分析具有以指数方式扩展而不是恒定量的变量的循环
- java - 获取 InvalidDataAccessApiUsageException:使用 ExampleMatcher 时,来自根 %s 的路径“%s”不得跨越循环属性引用
- reactjs - TypeError:无法读取 ReactJS 中未定义的属性“名称”
- powershell - PowerShell - 为什么这不重命名我的文件?
- aws-lambda - API GW V2 HTTP API 和旧版 lambda 授权器
- csv - 如何使用 SPSS 语法使用“获取数据”命令导入 .TSV 文件?
- python - 安装 TensorFlow