3

SqueezeboxServer(SBS)を制御できるC#でアプリケーションを開発しています。SBSとの通信は、JSONメッセージを介してhttp:// serverIP:9000 / jsonrpc.js に送信されるため、HTTPWepRequestを介してJSONメッセージを送信し、HTTPWebResponseを介して回答を取得します。

私が得た答えは、JSON表記の文字列です。そして、ここから問題が始まります...今のところ、JavaScriptSerializerを使用してJSONメッセージをオブジェクトに変換します。これは次のようになります。

public static Object FromJSON(this string reply)
{
    JavaScriptSerializer deSerializer = new JavaScriptSerializer();
    return deSerializer.DeserializeObject(reply);
}

このコードは、私が要求するデータを保持するオブジェクトを提供します。私が求めるデータは非常に異なる場合があります。答えが単一の答えである場合もあれば、複数の場合もあります。

私が含めた2つの画像を考えてみましょう:

最初のオブジェクトは、deSerializerによって返された後のオブジェクトを示しています。オブジェクトが4つのキーと値のペアを持つディクショナリであることがわかります。私が興味を持っているkvpは4番目です。重要な「結果」は、必要なデータを保持するものです。しかし、このキーには値として別のDictonaryがあります。そして、これは、アルバム名とそのIDである実際のデータが必要になるまで続きます。

代替テキスト

2番目の画像では、必要なデータは「_count」キーに属する値0です。ご覧のとおり、このオブジェクトはそれほど複雑ではありません。

代替テキスト

それで、私の質問の要点は、必要な情報を取得できるが、さまざまな種類のオブジェクト(さまざまな深さなど)で機能するソリューションをどのように作成するかです。

誰もが私を正しい方向に送ってくれることを願っています。

ありがとう!

4

1 に答える 1

0

逆シリアル化エクスペリエンスをより適切に制御するには、JavaScriptConverter を使用できます。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Web.UI.WebControls;
using System.Collections;

namespace System.Web.Script.Serialization.CS {
 public class ListItemCollectionConverter: JavaScriptConverter {

  public override IEnumerable <Type> SupportedTypes {
   //Define the ListItemCollection as a supported type.
   get {
    return new ReadOnlyCollection <Type> (new List <Type> (new Type[] {
     typeof(ListItemCollection)
    }));
   }
  }

  public override IDictionary <string, object> Serialize(object obj, JavaScriptSerializer serializer) {
   ListItemCollection listType = obj as ListItemCollection;

   if (listType != null) {
    // Create the representation.
    Dictionary <string, object> result = new Dictionary <string, object> ();
    ArrayList itemsList = new ArrayList();
    foreach(ListItem item in listType) {
     //Add each entry to the dictionary.
     Dictionary <string, object> listDict = new Dictionary <string, object> ();
     listDict.Add("Value", item.Value);
     listDict.Add("Text", item.Text);
     itemsList.Add(listDict);
    }
    result["List"] = itemsList;

    return result;
   }
   return new Dictionary <string, object> ();
  }

  public override object Deserialize(IDictionary <string, object> dictionary, Type type, JavaScriptSerializer serializer) {
   if (dictionary == null)
    throw new ArgumentNullException("dictionary");

   if (type == typeof(ListItemCollection)) {
    // Create the instance to deserialize into.
    ListItemCollection list = new ListItemCollection();

    // Deserialize the ListItemCollection's items.
    ArrayList itemsList = (ArrayList) dictionary["List"];
    for (int i = 0; i < itemsList.Count; i++)
     list.Add(serializer.ConvertToType <ListItem> (itemsList[i]));

    return list;
   }
   return null;
  }

 }
}

次に、それをデシリアライズします

var serializer = new JavaScriptSerializer(); 
serialzer.RegisterConverters( new[]{ new DataObjectJavaScriptConverter() } ); 
var dataObj = serializer.Deserialize<DataObject>( json ); 

JavaScriptSerializer.Deserialize - フィールド名を変更する方法

于 2011-09-28T22:43:43.607 に答える