【问题标题】:json to object, how should my object be like?json 到对象,我的对象应该是怎样的?
【发布时间】:2013-03-28 11:31:39
【问题描述】:

我有一个这样的json字符串

{ "class": "go.GraphLinksModel",
  "nodeDataArray": [ {"key":"CTR:2", "type":"Controller", "devicename":"ACU-1K", "imageUrl":"../../../../Images/ComputerSpeaker_32.png", "loc":"295 97"} ],
  "linkDataArray": [  ]}

我创建了一个这样的类

public class FloorplanItem
{
    public string Class { get; set; }
    public string[] NodeDataArray { get; set; }
    public string[] LinkDataArray { get; set; }        
}

我正在使用 newtonsoft.json 将 json 反序列化为一个对象,但我遇到了一些错误

JsonConvert.DeserializeObject<FloorplanItem>(json)

错误信息:

{"Error reading string. Unexpected token: StartObject. Path 'nodeDataArray[0]', line 2, position 23."}

我对 json 还是很陌生,所以如果这是微不足道的,请原谅我。

【问题讨论】:

    标签: c# .net json json.net


    【解决方案1】:

    使用http://json2csharp.com/。在那里复制json,你会得到以下类:

    public class NodeDataArray
    {
        public string key { get; set; }
        public string type { get; set; }
        public string devicename { get; set; }
        public string imageUrl { get; set; }
        public string loc { get; set; }
    }
    
    public class RootObject
    {
        public string @class { get; set; }
        public List<NodeDataArray> nodeDataArray { get; set; }
        public List<object> linkDataArray { get; set; }
    }
    

    上述类将符合Json.NET

    【讨论】:

    • 太好了,不知道有这样的工具。如果您不介意回答我的评论,json 是否区分大小写?即,如果我的 json 属性是 devicename,但在我的 C# 类中,我有 DeviceName,可以吗?
    • 不太确定,你可以在这里阅读,stackoverflow.com/questions/11266695/… 也可以在你的代码中用一个简单的 json 检查它
    • JSON.NET 默认不区分大小写。或者,您可以使用属性注释您的属性:[JsonProperty("overriddenPropertyName")]
    【解决方案2】:

    您的 NodeDataArray 被定义为字符串数组,而您的 JSON 文档明确将其定义为对象。

    另外,使用Web Essentials 2012,您可以执行名为将 JSON 粘贴为类 的特殊粘贴,它将为您生成所需的 CLR 类:

    public class FloorplanItem
    {
        public string Class { get; set; }
        public NodeDataArray[] NodeDataArray { get; set; }
        public object[] LinkDataArray { get; set; }
    }
    
    public class NodeDataArray
    {
        public string Key { get; set; }
        public string Type { get; set; }
        public string DeviceName { get; set; }
        public string ImageUrl { get; set; }
        public string Loc { get; set; }
    }
    

    反序列化似乎工作得很好(请注意,我已修复属性名称以遵守通用命名准则)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多