【问题标题】:Deserialize Json in C#在 C# 中反序列化 Json
【发布时间】:2009-11-12 09:12:25
【问题描述】:
{
  "person": "david",
  "images": {
    "usable_sizes": [
      [
        [150,
          41
        ],
        "image1.png"
      ],
      [
        [220,
          61
        ],
        "image2.png"
      ],
      [
        [220,
          61
        ],
        "image3.png"
      ]
    ],
    "uploader": null
  }
}

我在 C# 中使用 JavaScriptSerializer 来解析一些 JSON。以上是我从 webrequest 中得到的字符串。对字符串调用 Deserialize 会将 Person 放在对象中的正确位置,但我不知道嵌套在“images”下的数组使用什么类型。我完全不知所措。

这里是相关代码:

TopLevelObject topObj = new JavaScriptSerialize().Deserialize<TopLevelObj>(jsonStream);

public TopLevelObject
{
    public string person;
    public imgStruct images;
}

public class imgStructure
{
    public List<string[,][]> available_sizes;
}

但这并不重要。我已经为该类尝试了各种其他形式,但是如果没有正确的键,就无法反序列化以将数据放入。我无法更改入站 JSON,因为我从第三方使用它。

【问题讨论】:

    标签: c# json


    【解决方案1】:

    我认为您的课程应该是这样的:

    public class RootObj
    {
        public string person;
        public ImageDataObj images;
    }
    
    public class ImageDataObj
    {
        public object uploader;
        public List<List<object>> usable_sizes
    }
    

    如您所见,内部列表是对象列表。这是因为列表中有不同类型的项目:一个是列表(数字数据 [150, 41]),另一个是字符串(图像名称)。由于这个原因,我认为您不能强烈键入内部列表。 也许值得在运行时(使用 VS 调试工具)检查内部列表中对象的结构,这可以为您提供如何映射它的指示。

    usable_images 属性类型的具体情况如下:

    public List<List<Dictionary<List<int>,string>>> usable_sizes
    

    但这只是猜测。

    【讨论】:

    • 除了 object 关键字外,我一直到那里。令人惊讶的是,一个 5 个字母的单词交换可以让一切变得更好。非常感谢!!
    【解决方案2】:

    我建议您前往JSON.org 并使用他们的预构建解决方案之一。

    【讨论】:

    • .NET 库中包含一个序列化程序...我必须想象这在没有第三方解决方案的情况下是可以解决的。
    • 实际上,.NET 3.5 包含三种不同的 JSON 序列化程序。然而,在 2.0 中,只有一个,而且也不是很好,所以如果您使用 2.0,您必须获得第三方库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多