当键包含美元($)(元数据)时将 JSON 反序列化为 c# 对象

Deserializing a JSON to c# object when key contains dollar($)(Metadata)

所以我收到这样的回复

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

如何将其转换为 c# 对象,尝试使用此(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# 的新手,非常感谢任何输入,我基本上需要访问成功键变量

你需要你的对象属性匹配你的json字符串($id而不是_invalid_name_$id),那么你可以使用:

JsonConvert.DeserializeObject<RootObject>(jsonString);

嗯,你能做的就是

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

您需要将 [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 反序列化为 class 对象。

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

输出:

这里是一个简单的 class 序列化对象中的 json 字符串或对象 (T)。可能 de/serialize 个对象数组(列表)。

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