【问题标题】:Create DataContract Class in c# from Json having Dynamically generated keys从具有动态生成密钥的 Json 在 c# 中创建 DataContract 类
【发布时间】:2016-11-13 14:15:53
【问题描述】:

我有一个这样的示例 json:

{"'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 类:

  [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; }

   }

现在,我想使用 DataContractJsonSerializer 和 memorystream 访问属性,但问题是我的 json 中的键 '1234xxxxxx' 每次都是动态生成的。那么我应该如何访问我的 c# 代码中的属性呢?

【问题讨论】:

  • DataContractJsonSerializer 对您来说是硬性要求吗?你不能使用 Json.NET 吗?
  • 你可以 string.replace 而不是反序列化。
  • 看起来像 JSON deserialization of variable named parameter using DataContract 的副本。或者只是按照here 的解释,使用UseSimpleDIctionaryFormat 序列化一个Dictionary<string, List<attr>>
  • @botond.botos 是的,这是一个硬性要求。
  • @Haksu 你能解释一下吗,因为我是新手 :)

标签: c# json memorystream dynamics-crm-2016 datacontractjsonserializer


【解决方案1】:

如果DataContractJsonSerializer 对您来说不是硬性要求,您可以使用Json.NET 反序列化对象:

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

【讨论】:

  • 我不能使用 newtonsoft.json 或 system.web.helpers 类:(
【解决方案2】:

这里是数据模型。

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);

你可以毫无问题地反序列化 newJsonString。 RootObject.Attributes 中的新 PropertyName 匹配。 FixJsonDynamicProperty 也可以使用 RegExp 进行简化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    相关资源
    最近更新 更多