web-dev-qa-db-ja.com

Json.NET JsonConvert.DeserializeObject()はnull値を返します

私はしようとしました逆シリアル化この文字列:

string _jsonObject = {\"Ad\":{\"Type\":\"Request"\,
         \"IdAd\":\"[email protected]\",
         \"Category\":\"cat\",
         \"SubCategory\":\"subcat\"},
\"Position\":{\"Latitude\":\"38.255\",
              \"Longitude\":\"1.2\",
              \"Imei\":\"0123456789\"};
}";

Message _message = JsonConvert.DeserializeObject<Message>(_jsonObject);

「広告」ではきれいに機能しますが、「位置」では機能しません。何か案が ?

5
JossVAMOS

この問題を経験している可能性のある他の人、またはそれに関連する人を助けるために...

私の場合、他のオブジェクトの配列を持つオブジェクトがあり、それらのサブオブジェクトの参照型プロパティの1つは、逆シリアル化後は常にnullでした。 JSON.Netソースをダウンロードし、それをステップスルーして障害点を見つけるなど、さまざまなことを試しました。

簡単に言うと、問題はもちろん私自身の問題でした。これが私のJSONとクラスの非常に単純化されたバージョンです。

JSON

{
    "$id": "1",
    "RowCount": 10,
    "Rows": [{
        "$id": 2",
        "ItemId": "1",
        "ItemName": "Some Item",
        "Owner": {
            "Name": "John Doe",
            "Id": "711D04F5-586F-4FD4-8369-4C00B51DD86F",
            // other properties...
        },
        "OwnerId": "711D04F5-586F-4FD4-8369-4C00B51DD86F"
    },
    // more rows
    ]
}

クラス

public class Items
{
    public int RowCount { get; set; }
    public IEnumerable<Item> Rows { get; set; }
}

public class Item
{
    private string ownerId;

    public string ItemId { get; set; }
    public string ItemName { get; set; }
    public Person Owner { get; set; }
    public string OwnerId
    {
        get { return this.ownerId; }
        set {
            if (value != this.ownerId)
            {
                this.Owner = null;
            }
            this.ownerId = value;
        }
    }
}

public class Person
{
    public string Name { get; set; }
    public string Id { get; set; }
    // other properties
}

何が起こっていたのかというと、OwnerプロパティがOwnerIdプロパティの前にJSONに表示されたため、OwnerIdプロパティが設定されたときに、セッターコードが現在の値を決定したということです(現在の値がnullであったため)設定されている値と同じではなかったため、Ownerプロパティをnullに設定しました。

これを修正するには、設定されている値をOwnerオブジェクトのIDに対してもチェックし、同じ場合はOwnerをnullに設定することをスキップします。

確かに、私の問題の原因はすべての人に同じではないかもしれませんが、これは少なくとも、逆シリアル化中にオブジェクトが初期化されているときに何が起こっているかを再確認するための警告です。

11
Dave Parker

プロパティを公開するのを忘れました。それをすることを忘れないでください...

27
KthProg

どのように逆シリアル化しようとしているのかわかりませんが、これは機能するはずです。

string json = "{\"Ad\":{\"Type\":\"Request\",         \"IdAd\":\"[email protected]\",         \"Category\":\"cat\",         \"SubCategory\":\"subcat\"},\"Position\":{\"Latitude\":\"38.255\",              \"Longitude\":\"1.2\",              \"Imei\":\"0123456789\"}}";
var obj = JsonConvert.DeserializeObject<RootObject>(json);

public class Ad
{
    public string Type { get; set; }
    public string IdAd { get; set; }
    public string Category { get; set; }
    public string SubCategory { get; set; }
}

public class Position
{
    public string Latitude { get; set; }
    public string Longitude { get; set; }
    public string Imei { get; set; }
}

public class RootObject
{
    public Ad Ad { get; set; }
    public Position Position { get; set; }
}
4
I4V

私の場合、もっと微妙なエラーがあります。誤ってjsonキーに先頭または末尾のスペースを追加するのは簡単です。その場合、キーは認識されず、逆シリアル化しようとすると、値がnullに設定されます。

例:{" id": 123}
このidフィールドは、先頭のスペース" id"のために認識されません。これを修正するには、代わりに"id"を持つようにjsonを修正します。

1
Moshe

JSONの配列の名前がクラスのプロパティ名と一致することを確認してください

図解(「コンポーネント」を探す):

JSON:

{  
  "Components": [
    {
      "Attribute1": "ABC",
      "Attribute2": "XYZ"      
    }
  ]
}

クラス:

public class MyClass
{
    public IList<Component> Components { get; set; }
}

逆シリアル化:

JsonConvert.DeserializeObject<MyClass>(File.ReadAllText(@"ComponentSet.json"))
0
user2016089

私の問題は、JSON文字列の先頭にクラス名を含めていたことでした。デシリアライズしたいクラスを含む別のクラスのシリアル化された出力からコピーして貼り付け、これが正しいJSON文字列であると考えてクラス名を意図的に含めました。 JSON文字列からクラス名を削除すると、正常に逆シリアル化されました。

この記事は、これを実現するのに役立ちました: https://social.msdn.Microsoft.com/Forums/windowsapps/en-US/4d766a28-ff38-477f-8abf-48ed01f74cd2/jsonconvertdeserializeobjectlttgtjsonstring-returning-all-propertieslttgt- as-null?forum = wpdevelop

私はここでこの答えを見なかったので、私と同じ愚かな過ちを犯した人々に役立つことを願ってそれを含めています。

0
Sam