2012-08-07 62 views
-1

使用JsonFX我将json流加载到我的应用程序中。 json为其中一个对象使用URL,所以使用默认的访问对象的动态方式不起作用,因为某些URL中的字符对于成员名称无效。
http://opendatacommunities.org/doc/geography/lsoa/E01004700.json使用无效名称访问动态对象?

{ 
    'http://opendatacommunities.org/id/geography/lsoa/E01004700': { 
     'http://data.ordnancesurvey.co.uk/ontology/spatialrelations/easting': [ 
     { 
      type: 'literal', 
      value: '526252', 
      datatype: 'http://www.w3.org/2001/XMLSchema#integer' 
     } 
     ], 
     'http://www.w3.org/2003/01/geo/wgs84_pos#lat': [ 
     { 
      type: 'literal', 
      value: '51.51349', 
      datatype: 'http://www.w3.org/2001/XMLSchema#decimal' 
     } 
     ], 
     'http://statistics.data.gov.uk/def/administrative-geography/district': [ 
     { 
      type: 'uri', 
      value: 'http://statistics.data.gov.uk/id/local-authority-district/00BK' 
     } 
     ], 
     'http://opendatacommunities.org/def/geography#boundaryAsJSON': [ 
     { 
      type: 'uri', 
      value: 'http://opendatacommunities.org/lsoa_boundaries/E01004700.json' 
     } 
     ], 
     'http://data.ordnancesurvey.co.uk/ontology/spatialrelations/northing': [ 
     { 
      type: 'literal', 
      value: '180964', 
      datatype: 'http://www.w3.org/2001/XMLSchema#integer' 
     } 
     ], 
     'http://www.w3.org/2003/01/geo/wgs84_pos#long': [ 
     { 
      type: 'literal', 
      value: '-0.18198', 
      datatype: 'http://www.w3.org/2001/XMLSchema#decimal' 
     } 
     ], 
     'http://www.w3.org/2004/02/skos/core#notation': [ 
     { 
      type: 'literal', 
      value: 'E01004700' 
     } 
     ], 
     'http://www.w3.org/1999/02/22-rdf-syntax-ns#type': [ 
     { 
      type: 'uri', 
      value: 'http://opendatacommunities.org/def/geography#LSOA' 
     } 
     ], 
     'http://www.w3.org/2000/01/rdf-schema#label': [ 
     { 
      type: 'literal', 
      value: 'Westminster 016E' 
     } 
     ], 
     'http://www.w3.org/2002/07/owl#sameAs': [ 
     { 
      type: 'uri', 
      value: 'http://statistics.data.gov.uk/id/statistical-geography/E01004700' 
     } 
     ] 
    } 
} 

有没有办法,我可以访问该对象的方法吗?

+1

我只能想到如此快速的预分析并用其他的东西替换问题字符。 – 2012-08-07 13:05:19

回答

1

您可以使用我的类。或去Json.net。

/// <summary> 
/// Class Name:JSONConvert 
/// Description:JSON Class as JAVA's 
/// Authors:ppgame (The deserialization part is by ppgame. The serialization part is from http://www.mzwu.com/) 
/// Email: [email protected] 
/// Date:2012-08-07 
/// </summary> 
public static class JSONConvert 
{ 
    #region Global Variables 
    private static char[] _charary; 
    private static int _aryend; 

    #endregion 

    #region JSON Deserialization 

    /// <summary> 
    /// Convert string to JSONObject 
    /// </summary> 
    /// <param name="text"></param> 
    /// <returns></returns> 
    private static JSONObject DeserializeSingletonObject(ref int left) 
    { 
     JSONObject localjson = new JSONObject(); 
     while (left <= _aryend) 
     { 
      char c = _charary[left]; 
      if (c == ' ' || c == '\r' || c == '\n' || c == '\t') //skip empty char 
      { 
       left++; 
       continue; 
      } 
      if (c == ',') 
      { 
       left++; 
       continue; 
      } 
      char r = '\0'; 
      if (c == '\"' || c == '\'')  //beginning of key 
      { 
       left++; 
       r = c; 
      } 
      else if (c == '}')  //end of JSONObject 
      { 
       left++; 
       break; 
      } 
      int column = left; 
      while (!((_charary[column] == r || r == '\0') && _charary[column - 1] != '\\' && _charary[column + 1] == ':')) column++; 
      if (r == '\0') column++; 
      string key = new string(_charary, left, column - left);   //get the key 
      if (r == '\0') 
       left = column + 1; 
      else 
       left = column + 2; 
      c = _charary[left]; 
      while (c == ' ' || c == '\r' || c == '\n' || c == '\t') //skip empty char 
      { 
       left++; 
       c = _charary[left]; 
      } 
      if (c == '\"' || c == '\'')  //if value is string 
      { 
       left++; 
       int strend = left; 
       while (_charary[strend] != c || _charary[strend - 1] == '\\') strend++; 
       localjson[key] = new string(_charary, left, strend - left); 
       left = strend + 1; 
      } 
      else if (c == '{') // JSONObject 
      { 
       left++; 
       localjson[key] = DeserializeSingletonObject(ref left); 
      } 
      else if (c == '[')  //JSONArray 
      { 
       left++; 
       localjson[key] = DeserializeSingletonArray(ref left); 
      } 
      else 
      { 
       //other class, such as boolean, int 
       //all are converted to string, it can be enriched if in need 
       int comma = left; 
       char co = _charary[comma]; 
       while (co != ',' && co != '}') 
       { 
        comma++; 
        co = _charary[comma]; 
       } 
       int em = comma - 1; 
       co = _charary[em]; 
       while (co == ' ' || co == '\r' || co == '\n' || co == '\t') 
       { 
        em--; 
        co = _charary[em]; 
       } 
       localjson[key] = new string(_charary, left, em - left + 1); 
       left = comma; 
      } 
     } 
     return localjson; 
    } 

    /// <summary> 
    /// Convert string to JSONArray 
    /// </summary> 
    /// <param name="text"></param> 
    /// <returns></returns> 
    private static JSONArray DeserializeSingletonArray(ref int left) 
    { 
     JSONArray jsary = new JSONArray(); 
     while (left <= _aryend) 
     { 
      char c = _charary[left]; 
      if (c == ' ' || c == '\r' || c == '\n' || c == '\t') //skip empty char 
      { 
       left++; 
       continue; 
      } 
      if (c == ',') 
      { 
       left++; 
       continue; 
      } 
      if (c == ']') 
      { 
       left++; 
       break; 
      } 
      if (c == '{') //JSONObject 
      { 
       left++; 
       jsary.Add(DeserializeSingletonObject(ref left)); 
      } 
      else if (c == '[')  //JSONArray 
      { 
       left++; 
       jsary.Add(DeserializeSingletonArray(ref left)); 
      } 
      else if (c == '\"' || c == '\'')   //string 
      { 
       left++; 
       int strend = left; 
       while (_charary[strend] != c || _charary[strend - 1] == '\\') strend++; 
       jsary.Add(new string(_charary, left, strend - left)); 
       left = strend + 1; 
      } 
      else 
      { 
       //other class, such as boolean, int 
       //all are converted to string, it can be enriched if in need 
       int comma = left; 
       char co = _charary[comma]; 
       while (co != ',' && co != ']') 
       { 
        comma++; 
        co = _charary[comma]; 
       } 
       int em = comma - 1; 
       co = _charary[em]; 
       while (co == ' ' || co == '\r' || co == '\n' || co == '\t') 
       { 
        em--; 
        co = _charary[em]; 
       } 
       jsary.Add(new string(_charary, left, em - left + 1)); 
       left = comma; 
      } 
     } 
     return jsary; 
    } 

    #endregion 

    #region Public Interface 

    /// <summary> 
    /// Get a JSONObject instance from char[] 
    /// </summary> 
    /// <param name="text"></param> 
    /// <returns></returns> 
    public static JSONObject DeserializeCharToObject(char[] input) 
    { 
     _charary = input; 
     _aryend = _charary.Length - 1; 
     while (_aryend > 0) 
      if (_charary[_aryend] != '}') 
       _aryend--; 
      else 
       break; 
     int start = 0; 
     while (start < _aryend) 
      if (_charary[start] != '{') 
       start++; 
      else 
       break; 
     start++; 
     if (_aryend < start + 1) 
      return null; 
     return DeserializeSingletonObject(ref start); 
    } 

    /// <summary> 
    /// Get a JSONObject instance from string 
    /// </summary> 
    /// <param name="text"></param> 
    /// <returns></returns> 
    public static JSONObject DeserializeObject(string input) 
    { 
     return DeserializeCharToObject(input.ToCharArray());  //The first char must be '{' 
    } 

    /// <summary> 
    /// Get a JSONArray instance from char[] 
    /// </summary> 
    /// <param name="text"></param> 
    /// <returns></returns> 
    public static JSONArray DeserializeCharsToArray(char[] input) 
    { 
     _charary = input; 
     _aryend = _charary.Length - 1; 
     while (_aryend > 0) 
      if (_charary[_aryend] != ']') 
       _aryend--; 
      else 
       break; 
     int start = 0; 
     while (start < _aryend) 
      if (_charary[start] != '[') 
       start++; 
      else 
       break; 
     start++; 
     if (_aryend < start + 1) 
      return null; 
     return DeserializeSingletonArray(ref start); 
    } 

    /// <summary> 
    /// Get a JSONArray instance from string 
    /// </summary> 
    /// <param name="text"></param> 
    /// <returns></returns> 
    public static JSONArray DeserializeArray(string input) 
    { 
     return DeserializeCharsToArray(input.ToCharArray()); 
    } 
    /// <summary> 
    /// Serialize a JSONObject instance 
    /// </summary> 
    /// <param name="jsonObject"></param> 
    /// <returns></returns> 
    public static string SerializeObject(JSONObject jsonObject) 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("{"); 
     foreach (KeyValuePair<string, object> kvp in jsonObject) 
     { 
      if (kvp.Value is JSONObject) 
      { 
       sb.Append(string.Format("\"{0}\":{1},", kvp.Key, SerializeObject((JSONObject)kvp.Value))); 
      } 
      else if (kvp.Value is JSONArray) 
      { 
       sb.Append(string.Format("\"{0}\":{1},", kvp.Key, SerializeArray((JSONArray)kvp.Value))); 
      } 
      else if (kvp.Value is string) 
      { 
       sb.Append(string.Format("\"{0}\":\"{1}\",", kvp.Key, kvp.Value)); 
      } 
      else 
      { 
       sb.Append(string.Format("\"{0}\":\"{1}\",", kvp.Key, "")); 
      } 
     } 
     if (sb.Length > 1) 
      sb.Remove(sb.Length - 1, 1); 
     sb.Append("}"); 
     return sb.ToString(); 
    } 

    /// <summary> 
    /// Serialize a JSONArray instance 
    /// </summary> 
    /// <param name="jsonArray"></param> 
    /// <returns></returns> 
    public static string SerializeArray(JSONArray jsonArray) 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.Append("["); 
     for (int i = 0; i < jsonArray.Count; i++) 
     { 
      if (jsonArray[i] is JSONObject) 
      { 
       sb.Append(string.Format("{0},", SerializeObject((JSONObject)jsonArray[i]))); 
      } 
      else if (jsonArray[i] is JSONArray) 
      { 
       sb.Append(string.Format("{0},", SerializeArray((JSONArray)jsonArray[i]))); 
      } 
      else if (jsonArray[i] is string) 
      { 
       sb.Append(string.Format("\"{0}\",", jsonArray[i])); 
      } 
      else 
      { 
       sb.Append(string.Format("\"{0}\",", "")); 
      } 

     } 
     if (sb.Length > 1) 
      sb.Remove(sb.Length - 1, 1); 
     sb.Append("]"); 
     return sb.ToString(); 
    } 
    #endregion 
} 

/// <summary> 
/// Class Name:JSONObject 
/// Description:JSON Class 
/// Author:dnawo 
/// Website:http://www.mzwu.com/ 
/// Date:2010-01-06 
/// Version:1.1.0 
/// </summary> 
public class JSONObject : Dictionary<string, object> 
{ 
    public void put(string key, string value) 
    { 
     this[key] = value; 
    } 

    public void put(string key, int value) 
    { 
     this[key] = value.ToString(); 

    } 

} 

/// <summary> 
/// Class Name:JSONArray 
/// Description:JSONArray Class 
/// Author:dnawo 
/// Website:http://www.mzwu.com/ 
/// Date:2010-01-06 
/// Version:1.1.0 
/// </summary> 
public class JSONArray : List<object> 
{ } 
+0

我在最后使用了preparse方法。非常感谢 - 您可能想要更改变量名称以符合惯例,因为它们目前不以任何方式清晰。 – 2012-08-08 07:23:24