1. ホーム
  2. c#

[解決済み] Json.netを使ったJSONのパース

2022-10-28 10:35:58

質問

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がシリアライズする方法を知っているように、私のオブジェクトをどのようにコード化すればよいのか見当もつかないのです。

私は、私が作成した属性オブジェクトに必要なすべてを引き出すために、私自身の簡単なパーサーを書くことができると思ったのですが、ほとんどうまくいきません。

これがすべて意味をなすことを望みますが、何かアイデアはありますか?

どのように解決するのですか?

JSON.NETのことはよくわからないのですが、以下のようにすれば問題なく動作します。 JavaScriptSerializer から System.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のシリアライズとデシリアライズ