【问题标题】:Deserializing a JSON to c# object when key contains dollar($)(Metadata)当键包含美元($)(元数据)时,将 JSON 反序列化为 c# 对象
【发布时间】:2018-12-04 05:24:08
【问题描述】:

所以我收到了这样的回复

{"$id":"1","success":true,"errors":{"$id":"2","$values":[]}}

如何将其转换为 c# 对象,尝试使用 this(http://json2csharp.com/) 工具进行输出,但没有意义 这就是我得到的

x

public class Errors
{
    public string __invalid_name__$id { get; set; }
    public List<object> __invalid_name__$values { get; set; }
}

public class RootObject
{
    public string __invalid_name__$id { get; set; }
    public bool success { get; set; }
    public Errors errors { get; set; }
}

我对 c# 有点陌生,任何输入都将不胜感激,我基本上需要访问成功关键变量

【问题讨论】:

标签: c# json json-deserialization


【解决方案1】:

您需要将[JsonProperty] 属性添加到键名以美元开头的每个属性$

public class Errors
{
    [JsonProperty("$id")]
    public string id { get; set; }

    [JsonProperty("$values")]
    public List<object> values { get; set; }
}

public class RootObject
{
    [JsonProperty("$id")]
    public string id { get; set; }
    public bool success { get; set; }
    public Errors errors { get; set; }
}

因为 $ 表示元数据,而不是实际的数据字段。所以你必须修改你的JsonSerializerSettings 以忽略 MetadataPropertyHandling。

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore;

最后将您的 json 反序列化为上述类对象。

RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(json, settings);

在这里,我创建了一个示例控制台应用程序,用于演示上述代码的工作方式。

class program
{
    public static void Main()
    {
        string json = File.ReadAllText(@"Path to your json file");

        JsonSerializerSettings settings = new JsonSerializerSettings();
        settings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore;

        RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(json, settings);

        Console.WriteLine("id: " + rootObject.id);
        Console.WriteLine("success: " + rootObject.success);
        Console.WriteLine("errors.id: " + rootObject.errors.id);
        Console.WriteLine("errors.values: " + string.Join(",", rootObject.errors.values));
        Console.ReadLine();
    }
}

输出:

【讨论】:

  • 很高兴听到和欢迎 :)
【解决方案2】:

好吧,你能做的就是

public class Errors
{
    [JsonProperty(PropertyName = "$id")]
    public string id { get; set; }
    [JsonProperty(PropertyName = "$values")]
    public List<object> values { get; set; }
}

public class RootObject
{
    [JsonProperty(PropertyName = "$id")]
    public string id { get; set; }
    public bool success { get; set; }
    public Errors errors { get; set; }
}

【讨论】:

    【解决方案3】:

    您需要您的对象属性来匹配您的 json 字符串($id 而不是 _invalid_name_$id),然后您可以使用:

    JsonConvert.DeserializeObject<RootObject>(jsonString);
    

    【讨论】:

      【解决方案4】:

      这是一个简单的类,用于将 json 字符串从对象或对象 (T) 序列化。可以反序列化/序列化对象的数组(列表)。

      public class HelperSerializer<T> where T: class
      { 
          public static string WriteFromObject(T source)
          {
              using (var ms = new MemoryStream())            {  
                  var ser = new DataContractJsonSerializer(typeof(T));
                  ser.WriteObject(ms, source);
                  byte[] json = ms.ToArray();
                  return Encoding.UTF8.GetString(json, 0, json.Length);
              }
          }
      
          // Deserialize a JSON stream to an object.  
          public static T ReadToObject(string json)
          {          
      
              using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
              {
                  var ser = new DataContractJsonSerializer(typeof(T));
                  return ser.ReadObject(ms) as T;
              }
          }
      
      }
      

      使用persons = HelperSerializer<List<Person>>.ReadToObject(json); and var json = HelperSerializer<List<Person>>.WriteFromObject(persons);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-14
        • 1970-01-01
        • 2015-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-05
        • 1970-01-01
        相关资源
        最近更新 更多