当键包含美元($)(元数据)时将 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);
所以我收到这样的回复
{"$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);