当前位置:  开发笔记 > 编程语言 > 正文

使用Json.net解析JSON

如何解决《使用Json.net解析JSON》经验,为你挑选了2个好方法。

我正在尝试使用JSon.Net库解析一些JSON.文档似乎有点稀疏,我对如何完成我需要的东西感到困惑.这是我需要解析的JSON的格式.

{
    "displayFieldName" : "OBJECT_NAME", 
    "fieldAliases" : {
        "OBJECT_NAME" : "OBJECT_NAME", 
        "OBJECT_TYPE" : "OBJECT_TYPE"
    }, 
    "positionType" : "point", 
    "reference" : {
        "id" : 1111
    }, 
    "objects" : [ {
        "attributes" : {
            "OBJECT_NAME" : "test name", 
            "OBJECT_TYPE" : "test type"
        }, 
        "position" : {
            "x" : 5, 
            "y" : 7
        }
    } ]
}

我真正需要的唯一数据是对象数组中的东西.我是否有可能通过JSonTextReader之类的东西来解析它,只是拉出我想要的东西,比如OBJECT_TYPE和x和y位置?我似乎无法JSonTextReader以我想要的方式工作,而且我发现很少甚至没有使用它的例子.

看起来首先序列化然后使用LINQ与我的对象是理想的,我发现的每个例子都讨论首先序列化JSON,但我不确定如何为这个结构构建一个对象.特别是对象数组,它需要类似于属性和位置对象列表.我不知道如何编写我的对象,以便JSon.Net知道如何序列化它.

我以为我可以编写自己的简单解析器来将我需要的所有东西都拉到我创建的属性对象中,但我运气不好.

希望这一切都有意义,任何想法?



1> Marc Gravell..:

我不知道JSON.NET,但它适用JavaScriptSerializerSystem.Web.Extensions.dll(.NET 3.5 SP1):

using System.Collections.Generic;
using System.Web.Script.Serialization;
public class NameTypePair
{
    public string OBJECT_NAME { get; set; }
    public string OBJECT_TYPE { get; set; }
}
public enum PositionType { none, point }
public class Ref
{
    public int id { get; set; }
}
public class SubObject
{
    public NameTypePair attributes { get; set; }
    public Position position { get; set; }
}
public class Position
{
    public int x { get; set; }
    public int y { get; set; }
}
public class Foo
{
    public Foo() { objects = new List(); }
    public string displayFieldName { get; set; }
    public NameTypePair fieldAliases { get; set; }
    public PositionType positionType { get; set; }
    public Ref reference { get; set; }
    public List objects { get; set; }
}
static class Program
{

    const string json = @"{
  ""displayFieldName"" : ""OBJECT_NAME"", 
  ""fieldAliases"" : {
    ""OBJECT_NAME"" : ""OBJECT_NAME"", 
    ""OBJECT_TYPE"" : ""OBJECT_TYPE""
  }, 
  ""positionType"" : ""point"", 
  ""reference"" : {
    ""id"" : 1111
  }, 
  ""objects"" : [
    {
      ""attributes"" : {
        ""OBJECT_NAME"" : ""test name"", 
        ""OBJECT_TYPE"" : ""test type""
      }, 
      ""position"" : 
      {
        ""x"" : 5, 
        ""y"" : 7
      }
    }
  ]
}";


    static void Main()
    {
        JavaScriptSerializer ser = new JavaScriptSerializer();
        Foo foo = ser.Deserialize(json);
    }


}

编辑:

Json.NET使用相同的JSON和类.

Foo foo = JsonConvert.DeserializeObject(json);

链接:使用Json.NET序列化和反序列化JSON


有没有办法将JSON字符串中的名称值对转换为现有的C#变量类型(例如,数组或字典?),以便不必创建特定/自定义类?在我的例子中,JSON字符串将在Ruby/Rails中生成...

2> 小智..:

编辑:感谢Marc,阅读struct vs class问题,你说对了,谢谢!

我倾向于使用以下方法来执行您所描述的内容,使用JSon.Net的静态方法:

MyObject deserializedObject = JsonConvert.DeserializeObject(json);

链接:使用Json.NET序列化和反序列化JSON

对于Objects列表,我是否可以建议使用由您自己的小类包含attributesposition类创建的泛型列表.您可以为X和Y 使用Point结构System.Drawing(System.Drawing.PointSystem.Drawing.PointF浮点数).

对象创建后,它是容易让你与文本分析你,否则看后是数据.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有