将Array格式的数据解析成JSON格式的数据

在编程的过程中,数据的传输格式如何,会影响开发的效率和后期代码的维护, 并且现在许多的js中支持了JSON格式的数据,

比如angular、nodejs。本篇文章主要讲解Array(数组)形式数据的解析。其它格式的数据会在后续的文章中进行书写。

(1)定义一个解析Array的类JSONArray。

public class JSONArray {
  @SuppressWarnings("unchecked")
  public static String toJSONString(List paramList){
    //if param is null or "", return
    if( null==paramList || 0==paramList.size() ){
      return "null"; 
    }
    StringBuffer sb = new StringBuffer();
    boolean isFirstEle = true;//list参数是不是首个参数
    Iterator iterator = paramList.iterator();
    sb.append("[");
    while(iterator.hasNext()){
      //check is first element
      if(isFirstEle){
        isFirstEle = false;
      }else{
        sb.append(",");
      }  

      Object element = iterator.next();
      if( null==element){
        sb.append("null");
      }else{
        sb.append(JSONValue.toJSONString(element));
      }
    }
    sb.append("]");
    return sb.toString();
  }

}

(2) 定义一个解析各种类型数据的类JSONValue。

package com.ityongman.base;

import java.util.List;
import java.util.Map;


public class JSONValue {
  public static String toJSONString(Object paramObject) {
    if( null==paramObject ){
      return "null";
    }
    if( paramObject instanceof String ){
      return "\"" + escape( (String)paramObject ) + "\"";
    }

    if( paramObject instanceof Double){
      if( ((Double)paramObject).isInfinite() || ((Double)paramObject).isNaN() ){
        return "null";
      }
      return paramObject.toString();
    }
    if( paramObject instanceof Float ){
      if( ((Float)paramObject).isInfinite() || ((Float)paramObject).isNaN() ){
       return "null";
      }
      return paramObject.toString();
    }
    if( paramObject instanceof Number ){
      return paramObject.toString();
    }
    if( paramObject instanceof JSONAware ){
      return ((JSONAware)paramObject).toJSONString();
    }
    if( paramObject instanceof Map){
      return JSONMap.toString( (Map)paramObject );
    }
    if( paramObject instanceof List){
      return JSONArray.toJSONString((List)(paramObject));
    }

    return paramObject.toString();
  }

  private static String escape(String paramString) {
    if( null == paramString ){
      return null;
    }
    StringBuffer sb = new StringBuffer();
    escape(paramString,sb);
    return sb.toString();
  }

  static void escape(String paramString, StringBuffer sb_param) {
    // TODO Auto-generated method stub

    for(int i=0;i<paramString.length();i++){
      int asciindex = paramString.charAt(i);
      switch(asciindex){
      case 8: // \b
        sb_param.append("\\b");
        break;
      case 9: // \t--水平制表符
        sb_param.append("\\t");
        break;
      case 12: // \f
        sb_param.append("\\f");
        break;
      case 10: // "
        sb_param.append("\\n");
        break;
      case 13: // "
        sb_param.append("\\r");
        break;
      case 34: // "--文件分隔符
        sb_param.append("\\\"");
        break;
      case 47: // '--闭单引号
        sb_param.append("\\/");
        break;
      case 92: // \--反斜线
        sb_param.append("\\\\");
        break;
      default:
        if (((asciindex >= 0) && (asciindex <= 31)) || ((asciindex >= 127) && (asciindex <= 159)) || ((asciindex >= 8192) && (asciindex <= 8447))){
          String str = Integer.toHexString(asciindex);
          sb_param.append("\\u");
          for (int k = 0; k < 4 - str.length(); k++){
            sb_param.append('0');
          }
          sb_param.append(str.toUpperCase());
        }else{
          sb_param.append(asciindex);
        }
        break;
      }
    }

  }

}

(3)常见的数据类型有List, Map,String,Double, Float, Number; 上面的代码没有对Map进行处理,所以下面提供对Map的处理类JSONMap。

package com.ityongman.base;

import java.util.Iterator;
import java.util.Map;

public class JSONMap {

    public static String toString(Map paramMap) {
    // TODO
        if( null==paramMap || 0==paramMap.size() ){
          return "null";
        }
        StringBuffer sb = new StringBuffer();
        boolean isFirstEle = true;
        Iterator iterator = paramMap.entrySet().iterator();
        sb.append("{");
        while( iterator.hasNext() ){
          if( isFirstEle ){
            isFirstEle = false;
          }else{
            sb.append(",");
          }
          Map.Entry entity = (Map.Entry)iterator.next();
          toJSONString(String.valueOf(entity.getKey()), entity.getValue(),sb);
        }

        sb.append("}");
        return sb.toString();
      }

    private static String toJSONString(String paramString, Object paramValue,
       StringBuffer sb_param) {
      sb_param.append("\"");
      if( null==paramString || 0==paramString.length() ){
        sb_param.append("null");
      }else{
        JSONValue.escape(paramString,sb_param);
      }
      sb_param.append("\"").append(":");
      sb_param.append(JSONValue.toJSONString(paramValue));

      return sb_param.toString();
    }
}

(4)上面涉及到一个JSONAware类,它是接口,很多其它类对实现(implements)它,下面是具体的代码。

package com.ityongman.base;

public abstract interface JSONAware {
  public abstract String toJSONString();
}

 

总结:数据格式的转换是经常遇到的问题,尤其是JSON格式的数据,这会给我们带来许多的便利,所以提供者这个类的帮助类。

 

转载于:https://www.cnblogs.com/yewandemty/p/5550663.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用 Poco C++ 库中的 JSON 解析器来解析复杂的 JSON 格式数据的示例代码: ``` #include <iostream> #include <sstream> #include <Poco/JSON/Parser.h> #include <Poco/JSON/Array.h> #include <Poco/JSON/Object.h> using namespace Poco::JSON; int main() { std::string jsonString = R"({ "name": "John", "age": 30, "address": { "street": "123 Main St", "city": "Anytown", "state": "CA", "zip": "12345" }, "phoneNumbers": [ { "type": "home", "number": "555-555-1234" }, { "type": "work", "number": "555-555-5678" } ] })"; Parser parser; Var result = parser.parse(jsonString); Object::Ptr object = result.extract<Object::Ptr>(); std::string name = object->getValue<std::string>("name"); int age = object->getValue<int>("age"); Object::Ptr address = object->getObject("address"); std::string street = address->getValue<std::string>("street"); std::string city = address->getValue<std::string>("city"); std::string state = address->getValue<std::string>("state"); std::string zip = address->getValue<std::string>("zip"); Array::Ptr phoneNumbers = object->getArray("phoneNumbers"); for (Array::ConstIterator it = phoneNumbers->begin(); it != phoneNumbers->end(); ++it) { Object::Ptr phoneNumber = it->extract<Object::Ptr>(); std::string type = phoneNumber->getValue<std::string>("type"); std::string number = phoneNumber->getValue<std::string>("number"); std::cout << "Phone number (" << type << "): " << number << std::endl; } return 0; } ``` 在这个例子中,我们首先定义了一个包含复杂 JSON 格式数据的字符串 `jsonString`。然后,我们使用 `Parser` 类来解析这个字符串,并将解析结果存储在 `Var` 类型的变量 `result` 中。 接下来,我们使用 `getValue()` 函数从 `Object` 类型的变量 `object` 中获取 name 和 age 字段的值,并将它们存储在 `name` 和 `age` 变量中。我们还使用 `getObject()` 函数获取 address 对象,并使用 `getValue()` 函数从中获取 street、city、state 和 zip 字段的值。 最后,我们使用 `getArray()` 函数获取 phoneNumbers 数组,并使用 `Array::ConstIterator` 迭代器遍历数组中的每个对象。对于每个对象,我们使用 `getValue()` 函数获取 type 和 number 字段的值,并将它们打印到控制台上。 需要注意的是,以上代码仅为示例代码,实际应用中应该考虑错误处理和异常情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值