2017-09-20 10 views
1

(多少)複雑なjsonオブジェクトの属性を取得しようとしていますが、運がないとしています。私は、JSONからC#クラスを生成するjson2csharp.comに行って、これだ(ソート)複合Jsonオブジェクトの属性にアクセスするにはどうすればよいですか?

{ 
"displayFieldName": "REPNAME", 
"fieldAliases": { 
    "DISTRICT": "DISTRICT", 
    "REPNAME": "REPNAME" 
}, 
"fields": [ 
    { 
    "name": "DISTRICT", 
    "type": "esriFieldTypeDouble", 
    "alias": "DISTRICT" 
    }, 
    { 
    "name": "REPNAME", 
    "type": "esriFieldTypeString", 
    "alias": "REPNAME", 
    "length": 150 
    } 
], 
"features": [ 
    { 
    "attributes": { 
    "DISTRICT": 21, 
    "REPNAME": "Ira Anders" 
    } 
    } 
] 
} 

public class FieldAliases 
{ 
    public string DISTRICT { get; set; } 
    public string REPNAME { get; set; } 
} 

public class Field 
{ 
    public string name { get; set; } 
    public string type { get; set; } 
    public string alias { get; set; } 
    public int? length { get; set; } 
} 

public class Attributes 
{ 
    public int DISTRICT { get; set; } 
    public string REPNAME { get; set; } 
} 

public class Feature 
{ 
    public Attributes attributes { get; set; } 
} 

public class RootObject 
{ 
    public string displayFieldName { get; set; } 
    public FieldAliases fieldAliases { get; set; } 
    public List<Field> fields { get; set; } 
    public List<Feature> features { get; set; } 
} 

私は」をクエリから生成さ

自体は次のようになりますJSONオブジェクト、 "属性"オブジェクトを取得しようとしていて、DISTRICTとREPNAME(21とIra Andersでなければなりません)を返します。私はまた、私たちにjavaScriptSerializerを試してみたこれを行うには3つのまたは4種類の方法を試してみましたが、それはまだ

Attributes attr = new Attributes(); 
MemoryStream stream1 = new MemoryStream(Encoding.UTF8.GetBytes(MoRepjson)); 
stream1.Position = 0; 
DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(Attributes)); 
attr = deserializer.ReadObject(stream1) as Attributes; 
string dist = attr.DISTRICT.ToString(); 
string repname = attr.REPNAME; 
stream1.Close(); 

を動作しません -

DataContractJsonSerializerクラスを使用する:私は、次の方法がそれを試してみましたクラス、それはまた、動作しません:

JavaScriptSerializer ser = new JavaScriptSerializer(); 
Attributes attr = ser.Deserialize<Attributes>(MoRepjson); 
string dist = attr.DISTRICT.ToString(); 
string repname = attr.REPNAME; 

そしてJSON.NETライブラリを使用して - 再び動作しません:

Attributes attr = JsonConvert.DeserializeObject<Attributes>(MoRepjson); 
string dist = attr.DISTRICT.ToString(); 
string repname = attr.REPNAME; 

"dist"と "repname"という文字列が私のWebページにあります。何らかの理由で、私がそれを実行すると、DISTRICTは通常 "0"を表示します(上記の私のjsonが21を示すはずであることを示しています)。どこがどのようにゼロになるか分かりません。 REPNAME変数には、何も表示されません。

私は、このような

Attributes attr = new Attributes { DISTRICT = 9999, REPNAME = "Some Representative" }; 

...など退屈でつまらない、単純なJSONオブジェクトハードコーディングされたオブジェクトを作成した場合...私は(そのようrepname = attr.REPNAMEとして)DISTRICTとREPNAMEへのアクセス問題はありません。実際の/実際のjsonにアクセスして問題が発生したときだけです。私はないんだけれども、正しく「REPNAMEを」(表示

私はソートの「仕事」に得ている唯一のことは、このような

RootObject ro = JsonConvert.DeserializeObject<RootObject>(MoRepjson); 
string test = ro.displayFieldName; 

...としてRootObjectにアクセスすることです...なぜREPNAMEを表示していて、DISTRICTではないのか)。しかし、もし私がjsonオブジェクト全体にもっと深くしようとすると...

...私はレンガの壁にぶつかります。ちょうどそれを一体のために私は...と私のRootObjectに... ...

public Feature features { get; set; } 

public List<Feature> features { get; set; } 

を交換してみました...しかし、それはどちらか動作しません。

実際に属性以外のクラスは気にしませんが、属性オブジェクトに直接アクセスしようとすると空になります。私がRootObjectのカウントを取得したときに(正確な)「1」のカウントを取得したら、何かを返すことを知っているので、私はそれをどうやって得るのか分かりません。

ご協力いただければ幸いです。ありがとう!

答えて

0

あなたのコードが動作しない理由は、あなたが各Featureattributes性質を持っているfeaturesリスト、で、ルートオブジェクトを持っていることです。

あなただけちょうど次を使用し、すべての属性をしたい場合:ここ

RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(MoRepjson); 
var attributes = rootObject.features.Select(f => f.attributes); 

foreach (var a in attributes) 
{ 
    Console.WriteLine("DISTRICT: " + a.DISTRICT); 
    Console.WriteLine("REPNAME: " + a.REPNAME); 
} 

テストを:https://dotnetfiddle.net/CliXDW

0

MoRepjsonはあなたが投稿したJsonです。これはRootObjectを表すため、RootObjectとして逆シリアル化する必要があります。それを他のものとデシリアライズすることは意味をなさない。

第2に、あなたが出てくるのは、MoRepjsonオブジェクト全体です。特徴のList<>を含む。あなたはこのように個々のものにアクセスします。

RootObject ro = JsonConvert.DeserializeObject<RootObject>(MoRepjson); 
List<Feature> features = ro.features; 
Feature firstFeature = features[0]; 
Attributes attributes = firstFeature.attributes; 
string repname = attributes.REPNAME; 

以上は、Jsonの結果であるオブジェクトの構造を示す簡単なコードです。実際には、このようなことをします。

var rootObject = JsonConvert.DeserializeObject<RootObject>(MoRepjson); 

var firstAttributes rootObject.features 
    .Select(x => x.attributes) 
    .FirstOrDefault(); 

if(firstAttributes != null) 
{ 
    string repName = firstAttributes.REPNAME; 
    int district = firstAttributes.DISTRICT; 
} 
+0

それがうまくいった!私はグローバルな公開オブジェクトをテストしなければならなかった。ありがとう!間違いなく他の何かが今間違って行くでしょう。 :/ – JohnA

0

あなただけの特定の値が必要な場合、​​を使用することがはるかに簡単です:

string json = ... 
var root = JObject.Parse(json); 
var fieldAliases = root["fieldAliases"]; 
string district = fieldAliases["DISTRICT"].Value<string>(); 
string repName = fieldAliases["REPNAME"].Value<string>(); 
0

ありがとうございました。今私は別のエラーが発生しており、一貫してポップアップしているようには見えません。上に掲載された両方のソリューションpplで起こっているようです。それだけで、実行時エラーではなく、ビルドエラーを生成します。

コンパイラエラーメッセージ:CS0101:

:名前空間の属性 'は既にの定義が含まれている「」

はその後、2本のラインを指します

public class Attributes 

public int DISTRICT { get; set; } 

しかし、それは一貫してポップアップいない、私は何も変更を加えていないだろうと、突然それが動作します。

+0

これは2番目の疑問です。もしそうなら、別の質問をするべきです。なぜなら、stackoverflowの推奨フォーマットは[投稿ごとに1つの質問](https://meta.stackexchange.com/a/222741)です。または、これが元の質問の説明であれば、その質問を編集する必要があります。いずれにしても、誰かがあなたの追加の質問をこの回答に埋め込まれていることに気づくことはほとんどありません。 – dbc

関連する問題