1

を持つJSONからC#でのDataContractクラスを作成します。私が欲しい、今私はこのようなサンプルJSON持って動的に生成されたキーに

[System.Runtime.Serialization.DataContract] 
public class Rootobject 
{ 
    [System.Runtime.Serialization.DataMember] 
    public attr[] attrs { get; set; } 
} 

[System.Runtime.Serialization.DataContract] 
public class attr 
{ 
    [System.Runtime.Serialization.DataMember] 
    public string AttributeId { get; set; } 

    [System.Runtime.Serialization.DataMember] 
    public string AttributeName { get; set; } 

    [System.Runtime.Serialization.DataMember] 
    public string AttributeValue { get; set; } 

    } 

{"'1234xxxxxx'":[{"AttributeId":"1","AttributeName":"Brand","AttributeValue":""},{"AttributeId":"2","AttributeName":"Color","AttributeValue":"Red4"},{"AttributeId":"3","AttributeName":"Size","AttributeValue":"44"},{"AttributeId":"4","AttributeName":"Resolution","AttributeValue":"Full HD"}]} 

を私はこのようなサンプルのDataContractのクラスを作成しましたDataContractJsonSerializerとmemorystreamを使用して属性にアクセスすることができますが、私のjsonのキー '1234xxxxxx'は毎回動的に生成されるという問題があります。では、C#コードの属性にどのようにアクセスする必要がありますか?

+0

'DataContractJsonSerializer'は厳しい要件ですか?あなたはJson.NETを使用できませんか? –

+0

デシリアライズするよりもstring.replaceできます。 – Miguel

+0

DataContractを使用して[JSONの変数名付きパラメータの逆シリアル化]の複製のように見えます(https://stackoverflow.com/questions/33024768/json-deserialization-of-variable-named-parameter-using-datacontract/33027529#33027529)。または、[UseSimpleDIctionaryFormat'を使って 'Dictionary >'をシリアライズしてください(https://stackoverflow.com/questions/4559991/any-way-to-make-datacontractjsonserializer-serialize-dictionaries-properly)/27223290#27223290)。 – dbc

答えて

0

DataContractJsonSerializerはあなたのためのハード要件でない場合は、オブジェクトをデシリアライズするためにJson.NETを使用することができます。ここでは

JsonConvert.DeserializeObject<IDictionary<string, ICollection<attr>>>(jsonString); 
+0

newtonsoft.jsonやsystem.web.helpersクラスは使用できません:( – user2575854

0

データモデル。

public class Rootobject 
    { 
     public Attribute[] Attributes { get; set; } 
    } 

    public class Attribute 
    { 
     public string AttributeId { get; set; } 
     public string AttributeName { get; set; } 
     public string AttributeValue { get; set; } 
    } 

ここ静的見つけてDynamicAttributeName

public static string FixJsonDynamicProperty(string jsonString,char matchChar,string newParamName) 
     { 
      if (string.IsNullOrEmpty(jsonString)|| string.IsNullOrEmpty(newParamName)) 
      { 
       return jsonString; 
      } 


      var startIndex = jsonString.IndexOf(matchChar); 

      var lastIndex = jsonString.IndexOf(matchChar, jsonString.IndexOf(matchChar) + 1); 

      if (startIndex >= 0 && lastIndex > startIndex) 
      { 
       var dynamicParamName = jsonString.Substring(startIndex, lastIndex - startIndex + 1); 

       return jsonString.Replace(dynamicParamName, newParamName); 

      } 

      return jsonString; 
     } 

を置き換える方法と、このあなたはそれが

var jsonString ="{\"'1234xxxxxx'\":[{\"AttributeId\":\"1\",\"AttributeName\":\"Brand\",\"AttributeValue\":\"\"},{\"AttributeId\":\"2\",\"AttributeName\":\"Color\",\"AttributeValue\":\"Red4\"},{\"AttributeId\":\"3\",\"AttributeName\":\"Size\",\"AttributeValue\":\"44\"},{\"AttributeId\":\"4\",\"AttributeName\":\"Resolution\",\"AttributeValue\":\"Full HD\"}]}"; 

    var newJsonString = FixJsonDynamicProperty(jsonString,'\'',nameof(Rootobject.Attributes)); 

    Console.WriteLine(newJsonString); 

あなたはnewJsonStringwithoutの問題をデシリアライズすることができますどのように使用しますか。新しいPropertyNameはRootObject.Attributesに一致します。また、RegExpを使ってFixJsonDynamicPropertyを単純化することもできます。

関連する問題