1

次のようなJSONの逆シリアル化を試みます(93817や935812などの番号はサーバーから動的に生成されます。ハードコーディングすることはできません。):

{   "status":"1",               
"list":{      
 "93817":{         "item_id":"93817",         
                   "url":"http://url.com",         
                   "title":"Page Title",         
                   "time_updated":"1245626956",                
                   "time_added":"1245626956",                
                   "tags":"comma,seperated,list",         
                    "state":"0"                       
          },      
 "935812":{         "item_id":"935812",         
                    "url":"http://google.com",        
                    "title":"Google",         
                    "time_updated":"1245626956",       
                    "time_added":"1245626956",      
                    "tags":"comma,seperated,list",         
                    "state":"1"                     
  }   }}    

デシリアライズのコードは次のとおりです。

responseGetList =    e.Result.ToString(); //responseGetList is the JSON string

MemoryStream ms = new MemoryStream( Encoding.Unicode.GetBytes(responseGetList));

DataContractJsonSerializer serializer =
    new DataContractJsonSerializer( typeof(List<ResponseItem>) );

ResponseItem li = (ResponseItem)serializer.ReadObject(ms);

そして、以下はResponseItemクラスです。

namespace whatever
{
    [DataContract]
    public class ResponseItem
    {
        [DataMember(Name = "status")]
        string status;
        public string Status
        {
            get { return status; }
            set { status = value; }
        }
        [DataMember(Name = "list")]
        List<ListItem> list;
        private List<ListItem> List
        {
            get { return list; }
            set { list = value; }
        }
    }
    public class ListItem
    {
        [DataMember]
        List<Article> listArticle;
        public List<Article> ListArticle
        {
            get { return listArticle; }
            set { listArticle = value; }
        }
    }
}

public class Article
{
    [DataMember(Name = "item_id")]
    string item_id;
    public string Item_id
    {
        get { return item_id; }
        set { item_id = value; }
    }
    [DataMember(Name = "url")]
    string url;
    public string Url
    {
        get { return url; }
        set { url = value; }
    }
    [DataMember(Name = "title")]
    string title;
    public string Title
    {
        get { return title; }
        set { title = value; }
    }
    [DataMember(Name = "time_updated")]
    string time_updated;
    public string Time_updated
    {
        get { return time_updated; }
        set { time_updated = value; }
    }
    [DataMember(Name = "time_added")]
    string time_added;
    public string Time_added
    {
        get { return time_added; }
        set { time_added = value; }
    }
    [DataMember(Name = "tags")]
    string tags;
    public string Tags
    {
        get { return tags; }
        set { tags = value; }
    }
    [DataMember(Name = "state")]
    string state;
    public string State
    {
        get { return state; }
        set { state = value; }
    }
}

1ataContractJsonSerializer serializer = new DataContractJsonSerializer( typeof(List<ResponseItem>) );でInvalidCastExceptionが発生します。これは、JSONオブジェクトのマッピングの問題だと思います。誰か助けてもらえますか?

4

4 に答える 4

2

NewtonSoftのLINQtoJsonを使用してみてください。これは、json文字列を逆/シリアル化するためのよりクリーンな方法です。

ClassName class= new ClassName();
objectname = JsonConvert.DeserializeObject<ClassName>(responseGetList);

Json2C#を使用して、オブジェクトに直接逆シリアル化できるようにするために必要なClassNameを作成します。

オブジェクトを使用できます。__ 結果のいずれかを呼び出すには:コードの例:

object.list。(93817(c#では数値のみのメソッドは許可されないため、これをJsonPropertyでキャストする必要があります))。item_id = 93817

クリーナー:object.list.thenameyougavethemethod.item_id

幸運を祈ります。さらに質問がある場合は、コメントを追加してください。

編集:json文字列を解析し、特定のJson文字列にJsonPropertiesを追加しました。NewtonSoft .dllをダウンロードするだけで、プロジェクトへの参照を追加することを忘れないでください...

public class id93817
{
    public string item_id { get; set; }
    public string url { get; set; }
    public string title { get; set; }
    public string time_updated { get; set; }
    public string time_added { get; set; }
    public string tags { get; set; }
    public string state { get; set; }
}

public class id935812
{
    public string item_id { get; set; }
    public string url { get; set; }
    public string title { get; set; }
    public string time_updated { get; set; }
    public string time_added { get; set; }
    public string tags { get; set; }
    public string state { get; set; }
}

public class List
{
    [JsonProperty("93817")]
    public id93817 { get; set; }
    [JsonProperty("935812")]
    public id935812 { get; set; }
}

public class RootObject
{
    public string status { get; set; }
    public List list { get; set; }
}
于 2012-05-04T08:59:20.477 に答える
0

リストの最初の項目が正しくありません。JSONには「93817」と「935812」が表示されますが、これらはアイテムのプロパティではありません。JSONの最初の部分はプロパティ名である必要があります。Listのプロパティに対応しているため、「リスト」に対して正しく実行していますResponseItem。それらの番号を「listArticle」に変更します。また、JSON.Netに対するShawnWildermuthの提案も2番目です。

サーバーで生成されるJSONは、逆シリアル化されるのと同じ方法でシリアル化する必要があります(つまり、同じフレームワークを使用して(逆)シリアル化する)。JSONを手動で生成している場合は、生成しないでください。必要以上に多くの問題が発生します。

オブジェクトをシリアル化する場合は、次のものが必要です。

{   "status":"1",
    "list":{
        "listArticle":{
            "item_id":"93817",         
            "url":"http://url.com",         
            "title":"Page Title",         
            "time_updated":"1245626956",                
            "time_added":"1245626956",                
            "tags":"comma,seperated,list",         
            "state":"0"                       
        },
        "listArticle":{
            "item_id":"935812",         
            "url":"http://google.com",        
            "title":"Google",         
            "time_updated":"1245626956",       
            "time_added":"1245626956",      
            "tags":"comma,seperated,list",         
            "state":"1"
        }
    }
} 
于 2012-05-04T04:25:20.627 に答える
0

オブジェクトを逆シリアル化するためにJson.NETに切り替えてみてください。エラーが発生しにくく、壊れやすいです(もちろん、オープンソースであり、電話で動作します)>

于 2012-05-04T03:17:16.833 に答える
0

RIL#(http://rilsharp.codeplex.com/)のソースコードを読むことで問題が解決しました。問題は主にマッピングの問題です。辞書の使用が重要な解決策です。

[DataContract]
public class ResponseItem
{
    [DataMember(Name = "status")]
    public ListStatus Status { get; set; }

    [DataMember(Name = "since")]
    public double Since { get; set; }

    [DataMember(Name = "list")]
    public Dictionary<string, RilListItem> items { get; set; }

    public DateTime SinceDate
    {
        get
        {
            return UnixTime.ToDateTime(Since);
        }
    }

次に、Json.netを使用してJSONを逆シリアル化します。

  ResponseItem ri = new ResponseItem();
  ri = JsonConvert.DeserializeObject<ResponseItem>(responseGetList);
于 2012-05-09T07:46:59.400 に答える