2012-04-23 46 views
0

我实际上试图解析从我的PHP Web服务到C#对象的JSON请求响应。处理多个响应和空值

我发现一些代码示例使用json.net,然后我从我的葡萄酒类使这个代码:

public Wine(string json) 
    { 
     JObject jObject = JObject.Parse(json); 
     BottleName = (string)jObject["name"]; 
     Category = (string)jObject["category"]; 
     Prize50 = Double.Parse((string)jObject["prize_50"]); 
     Prize75 = Double.Parse((string)jObject["prize_75"]); 
     Prize150 = Double.Parse((string)jObject["prize_150"]); 
     Prize300 = Double.Parse((string)jObject["prize_300"]); 
    } 

这是完美的工作,如果只有1个响应像

"{\"id\":\"2\",\"name\":\"Pinot noir\",\"loc_wine\":\"",\"category\":\"Red\",\"prize_50\":\"12.800000\",\"prize_75\":\"16.500000\",\"prize_150\":\"0.000000\",\"prize_300\":\"0.000000\"} " 

但是当我在我的json响应中有另一个Json字符串时,我遇到了麻烦,我希望知道我该如何处理它?

而且我有时候会有空字段,我怎么能忽略它们呢?

谢谢你的帮忙! :-)

P.S.如果需要的话,这是怎么了,我从我的PHP文件发送我的DATAS:

 $req = "SELECT * 
     FROM t_wine 
     WHERE name= \"Pinot noir\""; // for test purpose 


     $res = mysqli_query($connection, $req); 
     while($data= mysqli_fetch_assoc($res)) { 
      extract ($data); 
      echo json_encode($data); 

     } 
+0

你说的“当我有什么意思另一个JSON字符串在我的JSON响应中,我希望知道我该如何处理它?“你的意思是你的json包含'Wine'的多个实例,还是你的意思是在同一个字符串中有第二个不同的类? – SouthShoreAK 2012-04-23 16:27:20

+0

我的意思是我有另一个酒的例子 – Edelweiss 2012-04-23 16:30:01

回答

2

如果从mysqli_fetch语句返回,则呼应每一行的JSON响应多行不把响应中的数组会给你不好的JSON。你的回应基本上是这样的:

{..some data...}{...some data...} 

所以我们来利用JSON的数组结构。改变你的PHP代码输出像数组

$res = mysqli_query($connection, $req); 
echo "["; 
while($data= mysqli_fetch_assoc($res)) { 
    extract ($data); 
    echo json_encode($data); 
    echo ","; 
} 
echo "]"; 

这会给你这样的:

[{...some data...},{...some data...},] 

请记住,这是粗糙。您需要在结束括号之前修剪最后一个逗号。但是这是一个有效的JSON数组。

您还需要修改C#以将jObject作为一组对象而不是一个对象来处理。

+0

我会尝试你在这里写的是什么,我有这种感觉,这正是我需要的感谢! – Edelweiss 2012-04-23 16:39:56

0

好吧,如果你正在尝试处理得到的Wine多个实例,并且希望忽略json.net空值,你可以这样做:

var settings = new JsonSerializerSettings{ NullValueHandling = NullValueHandling.Ignore }; 
                       } 
JsonConvert.DeserializeObject<IEnumerable<Wine>>(response.ToString(), settings);