2

以下は、エンドポイントから受け取ったjsonのセクションです。

以下のJsonを見ると、「User-Defined-Network-Name」はカスタムノードであり、名前は毎回変更されます。

このJsonのC#オブジェクトを定義するにはどうすればよいですか?

"addresses": {
            "public": [{
                "version": 6,
                "address": "2005:4600:788e:0910:1a72:81c0:ff03:c7y6"
            },
            {
                "version": 4,
                "address": "197.68.xx.xxx"
            }],
            "private": [{
                "version": 4,
                "address": "10.xx.xx.xxx"
            }],
            "User-Defined-Network-Name": [{
                "version": 4,
                "address": "192.xxx.x.xxx"
            }]
        }

これは私がどこまで来たかです-

[Serializable]
    public class Addresses
    {
        public List<Public> @public { get; set; }
        public List<Private> @private { get; set; }
    }

'JavascriptSerializer'クラスを使用してjsonを逆シリアル化します。

ありがとう、ライアン

4

4 に答える 4

2

addressesDictionary<string,List<YourClass>>where YourClassholdversionおよびのような型に逆シリアル化できますaddresss

var obj = new JavaScriptSerializer().Deserialize<Root>(jsonstring);

--

public class Root
{
    public Dictionary<string,List<VersionAddress>> addresses;
    //Your other fields/properties
}

public class VersionAddress
{
    public string version;
    public string address;
}
于 2013-01-16T23:00:10.097 に答える
0

C# の動的な性質を利用できます。

// this could come from user input:
string userDefinedName = "User-Defined-Network-Name";

    string json = "YOUR JSON COMES HERE";

var serializer = new JavaScriptSerializer();
dynamic result = serializer.DeserializeObject(json);
int version = result["addresses"][userDefinedName][0]["version"];
string address = result["addresses"][userDefinedName][0]["address"];

Console.WriteLine(version);
Console.WriteLine(address);

結果をループしたい場合:

foreach (dynamic item in result["addresses"][userDefinedName])
{
    int version = item["version"];
    string address = item["address"];

    Console.WriteLine(version);
    Console.WriteLine(address);
}
于 2013-01-16T22:25:02.847 に答える
0

ネットワーク名をキーにして、ネットワーク名を辞書にしてみませんか?その後、それを繰り返すだけです。

于 2013-01-16T22:28:49.137 に答える
-1

非推奨になっているため、の使用はお勧めしJavaScriptSerializerません。サードパーティのソリューションが必要な場合は、JSON.Net私が聞いたところによるとかなり良いです。

ただし、私は依存関係について奇妙な人なので、依存関係がまだ存在しない場合は、通常、自分でロールします。DataContractJsonSerializer幸いなことに、これはSystem.Runtime.Serialization名前空間によるものでそれほど難しくはありません。

あなたがする必要があるのは、最初にネストされた方法ですべてのオブジェクトを定義することです:

using System.Reflection;
using System.Runtime.Serialization;      // You will have to add a reference
using System.Runtime.Serialization.Json; // to System.Runtime.Serialization.dll

[DataContract]
public class AddressInfo
{ 
  [DataMember(Name = "address")]
  public string Address { get; set; }

  [DataMember(Name = "version")]
  public int Version { get; set; }
}

[DataContract]
public class AddressList
{ 
  [DataMember(Name = "public")]
  public IEnumerable<AddressInfo> Public { get; set; }

  [DataMember(Name = "private")]
  public IEnumerable<AddressInfo> Private { get; set; }

  [DataMember(Name = "User-Defined-Network-Name")]
  public IEnumerable<AddressInfo> UserDefined { get; set; }
}

次に、逆シリアル化を行うためのいくつかのヘルパーメソッド:

// This will change the DataMember.Name at runtime!
// This will only work if you know the node name in advance.
static void SetUserDefinedNodeName(string userDefinedNodeName)
{
  var type = typeof(AddressList);
  var property = type.GetProperty("UserDefined", BindingFlags.Default);
  var attribute = property.GetCustomAttribute<DataMemberAttribute>();

  if (attribute != null)
    attribute.Name = userDefinedNodeName;
}

static T Deserialize<T>(string jsonText, string userDefinedNodeName)
{
  SetUserDefinedNodeName(userDefinedName);

  var jsonBytes = Encoding.UTF8.GetBytes(jsonText);

  using (var stream = new MemoryStream(jsonBytes))
  {
    var serializer = new DataContractJsonSerializer(typeof(T));  
    var obj = serializer.ReadObject(stream) as T;

    return obj;
  }
}

次に、次のように使用します。

var jsonText = // get your json text somehow
var addressList = Deserialize<AddressList>(jsonText);
于 2013-01-16T22:39:22.773 に答える