当Json字符串包含'key1:value1‘时,可以将其转换为Dictionary类型。
但在我的例子中,它还包含一个字符串数组以及上面的key:value,即:
{k1:v1; "key2\":[{\"Key11\":{\"key21\":\"Val21\",\"key22\":\"val22\"}]
( Json数据包含一些字符串和数组。)
当我使用Dictionary或Dictionary --它无法将值转换为string --无法将string转换为string[]等。
仍然可以使用Dictionary,但是有没有更好的方法来处理这个问题呢?
谢谢Phani
发布于 2012-05-08 16:29:25
如果您不知道编译时的结构,那么就没有其他方法来序列化JSON字符串--它必须是Dictionary。但是,如果您使用的是C# 4.0,则可以使用DynamicObject.由于动态类型将类型解析推迟到运行时,如果使用这种方法进行序列化,则可以将序列化的对象视为强类型对象(尽管没有编译时支持)。这意味着您可以使用JSON样式的点符号来访问属性:
MyDynamicJsonObject.key2
为此,您可以从DynamicObject继承,并实现TryGetMember方法(quoted from this link, which has a full implementation)
public class DynamicJsonObject : DynamicObject
{
private IDictionary<string, object> Dictionary { get; set; }
public DynamicJsonObject(IDictionary<string, object> dictionary)
{
this.Dictionary = dictionary;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this.Dictionary[binder.Name];
if (result is IDictionary<string, object>)
{
result = new DynamicJsonObject(result as IDictionary<string, object>);
}
else if (result is ArrayList && (result as ArrayList) is IDictionary<string, object>)
{
result = new List<DynamicJsonObject>((result as ArrayList).ToArray().Select(x => new DynamicJsonObject(x as IDictionary<string, object>)));
}
else if (result is ArrayList)
{
result = new List<object>((result as ArrayList).ToArray());
}
return this.Dictionary.ContainsKey(binder.Name);
}
}
注意,动态类型目前不支持索引器表示法,因此对于数组,您需要使用implement a workaround using notation like this
MyDynamicJsonObject.key2.Item(0)
发布于 2012-05-08 17:13:06
您的示例不是有效的JSON,例如每个键和值应包含在"
中,例如{"k1":"v1"}
,左花括号和右花括号的数量必须匹配,如果您使用\"
对"
字符进行转义,则必须添加另一个"
字符,例如"key2\""
使用诸如JSONLint之类的工具来验证您的JSON是否正确。
https://stackoverflow.com/questions/10492672
复制