7

Json.NETでJSON構造を処理しようとしていますが、いくつかの問題が発生しました。

JSONに名前のない配列が含まれていると、クラスが機能しません。

Jsonの例:

{
    "graph_property" : [{
            "name" : "calculation_method",
            "value" : "Arithmetic"
        }, {
            "name" : "graph_type",
            "value" : "TIME"
        }
    ],
    "measurement" : [{
            "id" : "9997666",
            "alias" : "Measurement (TxP)[IE]-Home Page - Total Time (seconds)",
            "bucket_data" : [{
                    "name" : "2013-MAR-18 12:00 AM",
                    "id" : 1,
                    "perf_data" : {
                        "value" : "2.244",
                        "unit" : "seconds"
                    },
                    "avail_data" : {
                        "value" : "99.67",
                        "unit" : "percent"
                    },
                    "data_count" : {
                        "value" : "299",
                        "unit" : "#"
                    }
                }
            ],
            "graph_option" : [{
                    "name" : "perfwarning",
                    "value" : "-",
                    "unit" : "seconds"
                }, {
                    "name" : "perfcritical",
                    "value" : "-",
                    "unit" : "seconds"
                }, {
                    "name" : "availwarning",
                    "value" : "-",
                    "unit" : "percent"
                }, {
                    "name" : "availcritical",
                    "value" : "-",
                    "unit" : "percent"
                }, {
                    "name" : "bucketsize",
                    "value" : "86400",
                    "unit" : "seconds"
                }, {
                    "name" : "rows",
                    "value" : "1",
                    "unit" : "#"
                }, {
                    "name" : "pagecomponent",
                    "value" : "Total Time",
                    "unit" : "seconds"
                }, {
                    "name" : "avg_perf",
                    "value" : "2.244",
                    "unit" : "seconds"
                }, {
                    "name" : "avg_avail",
                    "value" : "99.67",
                    "unit" : "percent"
                }, {
                    "name" : "total_datapoint_count",
                    "value" : "300",
                    "unit" : "#"
                }, {}

            ]
        }, {
            "id" : "9997666",
            "alias" : "Measurement (TxP)[IE]-Women - Total Time (seconds)",
            "bucket_data" : [{
                    "name" : "2013-MAR-18 12:00 AM",
                    "id" : 1,
                    "perf_data" : {
                        "value" : "0.979",
                        "unit" : "seconds"
                    },
                    "avail_data" : {
                        "value" : "100.00",
                        "unit" : "percent"
                    },
                    "data_count" : {
                        "value" : "299",
                        "unit" : "#"
                    }
                }
            ],
            "graph_option" : [{
                    "name" : "perfwarning",
                    "value" : "-",
                    "unit" : "seconds"
                }, {
                    "name" : "perfcritical",
                    "value" : "-",
                    "unit" : "seconds"
                }, {
                    "name" : "availwarning",
                    "value" : "-",
                    "unit" : "percent"
                }, {
                    "name" : "availcritical",
                    "value" : "-",
                    "unit" : "percent"
                }, {
                    "name" : "bucketsize",
                    "value" : "86400",
                    "unit" : "seconds"
                }, {
                    "name" : "rows",
                    "value" : "1",
                    "unit" : "#"
                }, {
                    "name" : "pagecomponent",
                    "value" : "Total Time",
                    "unit" : "seconds"
                }, {
                    "name" : "avg_perf",
                    "value" : "0.979",
                    "unit" : "seconds"
                }, {
                    "name" : "avg_avail",
                    "value" : "100.00",
                    "unit" : "percent"
                }, {
                    "name" : "total_datapoint_count",
                    "value" : "299",
                    "unit" : "#"
                }, {}

            ]
        }
    ],
    "link" : {
        "type" : "application/json",
        "href" : "http://api.website.tld?format=json",
        "rel" : "slotmetadata"
    }
}

Json.NETのクラス:

using System;
using System.Collections.Generic;

namespace CAKR.Graph
{
    /// <summary>
    /// Description of KN_Graph.
    /// </summary>
    public class GraphProperty
    {
        public string name { get; set; }
        public string value { get; set; }
    }

    public class PerfData
    {
        public string value { get; set; }
        public string unit { get; set; }
    }

    public class AvailData
    {
        public string value { get; set; }
        public string unit { get; set; }
    }

    public class DataCount
    {
        public string value { get; set; }
        public string unit { get; set; }
    }

    public class BucketData
    {
        public string name { get; set; }
        public int id { get; set; }
        public PerfData perf_data { get; set; }
        public AvailData avail_data { get; set; }
        public DataCount data_count { get; set; }
    }

    public class GraphOption
    {
        public string name { get; set; }
        public string value { get; set; }
        public string unit { get; set; }
    }

    public class Measurement
    {
        public string id { get; set; }
        public string alias { get; set; }
        public List<BucketData> bucket_data { get; set; }
        public List<GraphOption> graph_option { get; set; }
    }

    public class Link
    {
        public string type { get; set; }
        public string href { get; set; }
        public string rel { get; set; }
    }

    public class RootObject
    {
        public List<GraphProperty> graph_property { get; set; }
        public List<Measurement> measurement { get; set; }
        public Link link { get; set; }
    }
}

私のコード:

var myObject = JsonConvert.DeserializeObject<CAKR.Graph.Measurement>(MyJsonString);

「Measurment」子配列のデータを含むオブジェクトを取得できない理由がわかりません。名前付きの値を挿入すると、機能します...

4

4 に答える 4

9

それで、私はこれを機能させるためにかなり長い間苦労していました。しかし、結局のところ、解決策はそれほど難しくありません。うまくいけば、私の応答で私は何人かの人々を助けます。

私の場合の解決策は

  1. nu.getを使用してJSON.netをプロジェクトにインストールします
  2. 配列などを含むJSONオブジェクトを作成します。オブジェクトの形式が正しいことを確認してください。例...

{"製品の詳細":[

  {
      "ProjectImg"    : "http://placehold.it/400x300",
      "Category"      : "Cars",
      "ProjectTitle"  : "Cars of the future",
      "ProjectDesc"   : "Test project",
      "GenSpecList"   : ["Specs1", "Specs2", "Specs3", "Specs4"],
      "OptionList"    : [{    "OptionNr"  : "1",
                              "Options"   : ["Opt1", "Opt2", "Opt3"]
                          },
                          {   "OptionNr"  : "2",
                              "Options"   : ["Opt1", "Opt2", "Opt3"]
                          },
                          {   "OptionNr"  : "3",
                              "Options"   : ["Opt1", "Opt2", "Opt3"]
                          },
                          {   "OptionNr"  : "4",
                              "Options"   : ["Opt1", "Opt2", "Opt3"]
                          },
                          {   "OptionNr"  : "5",
                              "Options"   : ["Opt1", "Opt2", "Opt3"]
                          },
                          {   "OptionNr"  : "6",
                              "Options"   : ["Opt1", "Opt2", "Opt3"]
                          }
                        ],
      "Articles"      : [{    "tileImg" : "'Images/Project/1.jpg'",
                              "tileTit" : "Title1",
                              "tileArt" : "Article text here..."
                          },
                          {
                              "tileImg" : "'Images/Project/2.jpg'",
                              "tileTit" : "Title2",
                              "tileArt" : "Article text here..."
                          },
                          {
                              "tileImg" : "'Images/Project/3.jpg'",
                              "tileTit" : "Title3",
                              "tileArt" : "Article text here..."
                          },
                          {
                              "tileImg" : "'Images/Project/4.jpg'",
                              "tileTit"   : "Title4",
                              "tileArt"   : "Article text here..."
                          }
                         ]
  }
]
}
  1. json2csharp.comにアクセスし、JSONオブジェクトを入力ボックスにコピーして、[生成]ボタンをクリックします。生成されたcsharpモデル(これは実際に私の苦労を解決するための鍵でした!)をViewModelにコピーします。
  2. 私の場合、json2csharp.comによって生成されたすべてのクラスのプライマリクラスはRootObjectであり、次のようになりました。

    public class Article
    {
        public string tileImg { get; set; }
        public string tileTit { get; set; }
        public string tileArt { get; set; }
    }
    
    public class OptionList
    {
        public string OptionNr { get; set; }
        public List<string> Options { get; set; }
    }
    
    public class ProductDetail
    {
        public string ProjectImg { get; set; }
        public string Category { get; set; }
        public string ProjectTitle { get; set; }
        public string ProjectDesc { get; set; }
        public List<string> GenSpecList { get; set; }
        public List<OptionList> OptionList { get; set; }
        public List<Article> Articles { get; set; }
    }
    
    public class RootObject
    {
        public List<ProductDetail> ProductDetail { get; set; }
    }
    
  3. 次に、コントローラーで次のコードを使用します(ここに完全なファイルをコピーしただけです)

    using Project.Details; //<-- this is my ViewModel namespace name
    using Newtonsoft.Json;
    using System.IO;
    using System.Threading.Tasks;
    
    namespace WebApplication.Controllers
    {
        public class JSONController : Controller
        {
            //
            // GET: /JSON/
            public async Task<ActionResult> Index()
            {
                StreamReader file = new StreamReader("C:\\Users\\YourName\\etc\\File.json");
                String json = await file.ReadToEndAsync();
    
                var Project = JsonConvert.DeserializeObject<RootObject>(json);
    
                return View();
            }
        }
    }
    

これで、すべてが正常に機能するはずです。配列が配列内にあるなどです。私のソリューションがお役に立てば幸いです。私は熱心なプログラマーではないので、効率性について何かを見逃した場合は、このコードを改善するためのヒントをいくつか受け取りたいと思います...

よろしく、レイモンド

于 2014-02-01T13:05:11.650 に答える
4

もうすぐです。使用するだけ

var myObject = JsonConvert.DeserializeObject<CAKR.Graph.RootObject>(MyJsonString);

それ以外の

var myObject = JsonConvert.DeserializeObject<CAKR.Graph.Measurement>(MyJsonString);
于 2013-03-19T18:22:42.853 に答える
2

まず第一に、クラスのすべてのプロパティに、Measurementで示されているとおりに正確に名前を付ける必要はありませんMyJsonStringJsonProperty属性を使用して、クラスのプロパティを装飾できます。

もう1つは、の一部を逆シリアル化し、MyJsonStringの配列のみを抽出する場合は、メソッドMeasurementに正しいTタイプを指定する必要があります(この場合はです。DeserializeIEnumerable<Measurement>

次のコードが役立ちます。

    dynamic context = JObject.Parse(MyJsonString);
    var myObject = JsonConvert.DeserializeObject<IEnumerable<Measurement>>(context.measurement.ToString());
于 2013-03-19T18:30:01.530 に答える
0

私は非常に簡単な方法を使用してJson配列を逆シリアル化します。多数のパブリック変数を持つ大量のパブリッククラスを使用する代わりに。Dynamicオブジェクトを使用し、jsonをオブジェクトとしてJSONConvert.DeserializeObjectに渡します。

これがどのように機能するかです。次のJSONがあるとします。

string json = { 'Name': 'John Doe', 
  'Address': { 'City': 'Atlanta', 'State': 'GA' }, 
  'Age': 30}

文字列jsonをJSONConvert.DeserializeObjectに渡すことができます。

dynamic outputArray = JsonConvert.DeserializeObject(json);

次に、作成したばかりの動的アイテムを使用して、そのようにJsonデータを収集できます。

string getName = outputArray.Name //This will return "John Doe"

Json内に配列がある場合は、次を使用できます

string getCity = outputArray.Address.City; //This will return "Atlanta".

パブリック変数のクラスターがなくても、データを取得する場所を変更するのは非常に簡単です...必要に応じて、値をパブリック変数に保存することもできます。

以下は、私が完全な方法を使用する方法です。

using (var client = new WebClient())
        {
            string json = client.DownloadString(url);
            string output = json.ToString();

            dynamic outputArray = JsonConvert.DeserializeObject(output);

            string _age = outputArray.age;
            string appID = outputArray.data.app_id;

            Debug.Write(outputArray.Something); //Just match value of json        
        }
于 2015-04-02T16:38:48.327 に答える