2012-04-02 42 views
0

我想使用amcharts,我想用JSON格式化我的图表的数据。但是,似乎amcharts接受的语法不是有效的JSON。在amcharts中使用JSON - 如何修改JSON输出(Ruby on Rails)

这里是该数据用于硬编码amchart图表的JavaScript代码:

var chartData = [{ 
      country: "Czech Republic", 
      litres: 301.90 
     }]; 

下面是代码,如果我想创建嵌入红宝石同一图表:

控制器

@chart_data = [{"country": "Czech Republic", "litres": 301.90}] 

查看

var chartData = <%= @chart_data.to_json %>; 

valid JSON输出:

[{"country": "Czech Republic", "litres": 301.90}] 

然而,什么amcharts接受的是:

[{country: "Czech Republic", litres: 301.90}] 

因此,我的图表不工作,因为amcharts不接受有效的JSON。那么有没有一种方法可以创建“无效的”JSON而不用国家和公升的双引号?还是有更好的方式来获取amcharts接受的形式的数据?任何帮助将不胜感激。

下面是完整的JavaScript:

<script type="text/javascript"> 
     var chart; 
     var legend; 

     var chartData = [{ 
      country: "Czech Republic", 
      litres: 301.90 
     }, { 
      country: "Ireland", 
      litres: 201.10 
     }, { 
      country: "Germany", 
      litres: 165.80 
     }, { 
      country: "Australia", 
      litres: 139.90 
     }, { 
      country: "Austria", 
      litres: 128.30 
     }, { 
      country: "UK", 
      litres: 99.00 
     }, { 
      country: "Belgium", 
      litres: 60.00 
     }]; 

     AmCharts.ready(function() { 
      // PIE CHART 
      chart = new AmCharts.AmPieChart(); 
      chart.dataProvider = chartData; 
      chart.titleField = "country"; 
      chart.valueField = "litres"; 
      chart.outlineColor = "#FFFFFF"; 
      chart.outlineAlpha = 0.8; 
      chart.outlineThickness = 2; 

      // WRITE 
      chart.write("chartdiv"); 
     }); 
    </script> 
+0

您能否提供一个您对amcharts打电话的例子吗? – 2012-04-02 23:38:33

+0

嗨乔,我添加了上面的完整的JavaScript的一个例子。除此之外,唯一的其他部分是包括可以从他们的网站下载的amcharts.js文件。我希望那是你的意思。如果没有,请告诉我。 – diasks2 2012-04-03 01:13:49

+0

在您给出的示例中,amCharts不会读取JSON,而是浏览器的JS引擎,然后代码将生成的对象传递给amCharts。但任何浏览器都应该处理解析正确的JSON。这里究竟发生了什么? – 2013-04-18 15:18:11

回答

1

我会在这里失去了点,但如果你不使用@chart_data其他地方,你可以只建立在控制器中的伪JSON数据串并删除在.to_json呼叫您的看法:

控制器:

@chart_data = "[{country: \"Czech Republic\", litres: 301.90}]" #build this string dynamically 

查看:

var chartData = <%= @chart_data %>; 

如果您正在使用@chart_data其他地方,你还可以创建一个@formatted_chart_data

如果你想使用AJAX来减少开销当图表没有显示你可以添加什么也不做的动作,但你的回报图表数据,并从您的JS调用它:

控制器:

def get_formatted_chart_data 
    chart_data = "[{country: \"Czech Republic\", litres: 301.90}]" 
    render :text => chart_data 
end 

抑或是动态的构建是最困难的部分字符串?

+0

感谢Mishaux,这是非常有帮助的,并给了我很多工作。我认为动态构建字符串是很难的部分,但您的回答帮助我开始朝着正确的方向发展。谢谢! – diasks2 2012-04-03 14:53:29

+0

这是一个[教程](http://www.diasks2.com/post/21827658042/ruby-on-rails-tutorial-a-dynamic-amcharts-graph)通过获取amcharts图表来获取数据数据库。 – diasks2 2012-04-26 02:59:13

0

来自amCharts:“amCharts并不直接支持JSON,它不会加载外部数据文件或任何东西,它只是使用原生JavaScript数据对象,所以它真的取决于浏览器的JS解析器它可以或不可以的数据格式读。”

http://www.amcharts.com/forum/viewtopic.php?id=7049

我假设你有一个以上的图表,并建立了自定义字符串格式化每个可能比较容易使用默认JSON或Rabl的格式来有点麻烦。

什么,你也可以做的是创造一个常见的JavaScript功能,并使用正则表达式一点的JSON过滤到amCharts友好format.and

function CleanJSONForAMCharts(json) { 
    return json.replace(/"(\w+)"\s*:/g, '$1:'); 
} 

现在这仍然是当然是一个字符串,而不是现在的对象amCharts阵列期待。在传递给dataProvider之前,必须在返回的字符串上调用Eval()。

//sample data that would have been returned from a RESTful service or another JSON returning method 
var chartData = CleanJSONForAMCharts("[{\"title\":\"sample 1\",\"value\":130},{\"title\":\"sample 2\",\"value\":26}]"); 

var chart = new AmCharts.AmSerialChart(); 
chart.categoryField = "title"; 
chart.dataProvider = eval(chartData); 

var graph = new AmCharts.AmGraph(); 
graph.valueField = "value"; 
graph.type = "column"; 
graph.fillAlphas = 1; 
chart.addGraph(graph); 

chart.write("chartdiv");