一尘不染

使用Json.net解析JSON

c#

我正在尝试使用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会知道如何序列化它。

我以为我可以编写自己的简单解析器,以将所需的所有内容提取到我创建的属性对象中,但是运气不佳。

希望这一切有意义,有什么想法吗?


阅读 300

收藏
2020-05-19

共1个答案

一尘不染

我不了解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<SubObject>(); }
    public string displayFieldName { get; set; }
    public NameTypePair fieldAliases { get; set; }
    public PositionType positionType { get; set; }
    public Ref reference { get; set; }
    public List<SubObject> 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<Foo>(json);
    }


}

编辑:

Json.NET使用相同的JSON和类进行工作。

Foo foo = JsonConvert.DeserializeObject<Foo>(json);

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

2020-05-19