首页 > 解决方案 > 状态为 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 显示为模型。

标签: c#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();

而这一次我已经尝试过了……


推荐阅读