【问题标题】:Token StartObject in state ObjectStart would result in an invalid JSON object. Path ''."状态为 ObjectStart 的令牌 StartObject 将导致无效的 JSON 对象。小路 ''。”
【发布时间】:2019-07-17 15:43:17
【问题描述】:

我有这个 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


    【解决方案1】:

    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();
    

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

    【讨论】:

    • @它会抛出一个错误,我会检查它并告诉你:) ...但是是的,它是对象数组类型的属性。
    • 我现在在生成父项时遇到了问题......像这些 { name: 'Dashboard', url: '/Home', icon: 'icon-speedometer', },
    • 完美..谢谢你uuuuuuuu
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    相关资源
    最近更新 更多