2012-05-08 59 views
1

当Json字符串包含'key1:value1'时,可以将其转换为字典类型。当Json字符串包含字符串和字符串数组时,JSON序列化程序出现问题

但在我的情况下,还包含一个字符串与上述密钥一起的数组:值,即:(JSON数据包含一些串和一些阵列)

{k1:v1; "key2\":[{\"Key11\":{\"key21\":\"Val21\",\"key22\":\"val22\"}] 

当我用字典<字符串,字符串[]>或字典<串,的ArrayList> - 这是在值未按照串 - 不能转换字符串字符串[]等

尽管如此字典<串,对象>可以是你sed,但是有没有更好的方法来处理这个问题?

感谢 Phani

+0

它是你写的一个固定的结构,还是你在寻找一个通用的解决方案? – McGarnagle

+0

通用解决方案,假设我们不知道结构... – HydPhani

回答

1

如果你不知道在编译时的结构,那么就没有其他办法来序列化一个JSON string--它必须是词典<字符串,对象>。但是,如果您使用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) 
0

您的示例不是有效的JSON,例如每个键和值都应该被"围绕,例如, {"k1":"v1"},开启和关闭大括号的数量必须匹配,如果您使用\"转义"字符,则必须添加另一个"字符,例如,使用JSONLint等工具来验证您的JSON是正确的。