我得到一个json字符串,几乎没有数据一致性问题。 例如,json字符串中的一个字段返回字符串列表,而其他json字符串中的相同字段返回字典(键,值对)。
我的类包含已解析的json值,该字段的属性为List。 由于此数据一致性问题,json字符串未正确解析。
以下是解析json字符串的代码
JavaScriptSerializer serializer = new JavaScriptSerializer();
myClass mc = serializer.Deserialize<myClass>(jsonString);
有什么方法可以编写自定义代码来解析json字符串并将其映射到myClass?
答案 0 :(得分:1)
你没有给出你想要完成什么的具体例子,这意味着我们需要自己做一个例子。考虑以下课程:
public class myClass
{
public Dictionary<string, string> data { get; set; }
}
考虑以下两个JSON字符串:
{"data": ["zero", 1, "two"]}
{"data": {"0": "zero", "1":1, "2":"two"}}
似乎您可能希望以相同的方式解析这些,将数组转换为Dictionary<string, string>
,其键是数组索引。这可以通过以下JavaScriptConverter
:
public class myClassConverter : JavaScriptConverter
{
public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
{
var myClass = new myClass();
object data;
if (dictionary.TryGetValue("data", out data))
{
if (data.IsJsonArray())
{
myClass.data = data.AsJsonArray()
.Select((o, i) => new KeyValuePair<int, object>(i, o))
.ToDictionary(p => p.Key.ToString(NumberFormatInfo.InvariantInfo), p => serializer.ConvertToType<string>(p.Value));
}
else if (data.IsJsonObject())
{
myClass.data = data.AsJsonObject()
.ToDictionary(p => p.Key, p => serializer.ConvertToType<string>(p.Value));
}
}
return myClass;
}
public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
{
throw new NotImplementedException();
}
public override IEnumerable<Type> SupportedTypes
{
get { return new [] { typeof(myClass) }; }
}
}
public static class JavaScriptSerializerObjectExtensions
{
public static bool IsJsonArray(this object obj)
{
if (obj is string || obj.IsJsonObject())
return false;
return obj is IEnumerable;
}
public static IEnumerable<object> AsJsonArray(this object obj)
{
return (obj as IEnumerable).Cast<object>();
}
public static bool IsJsonObject(this object obj)
{
return obj is IDictionary<string, object>;
}
public static IDictionary<string, object> AsJsonObject(this object obj)
{
return obj as IDictionary<string, object>;
}
}
传递给IDictionary<string, object>
的{{1}}对应于要转换的JSON对象中的键/值对。对于特定密钥(在这种情况下为Deserialize()
),"data"
值将为object
,如果该值又是JSON对象,则为IDictionary<string, object>
(具体而言)如果值是JSON数组,则为IEnumerable
)。通过针对适当的类型测试值,可以进行转换。
转换器只进行反序列化。像这样使用它:
ArrayList